2.【CPP】入门(宏||内联函数||拷贝构造||析构函数||构造函数)

发布时间:2024年01月12日

0x01.引言

1.实现一个宏函数ADD

#define ADD(x,y) ((x)+(y))//宏是预编译阶段完成替换,注意括号

2.宏的优缺点

优点:
1.增强代码的复用性
2.宏函数不用建立栈帧,提高性能
缺点:
1.不方便调试
2.没有安全检查

0x02.内联函数

1.以空间换时间,减少了函数调用栈帧的开销
2.内联函数只是对编译器的建议
3.短小的函数建议定义为内联,而递归循环不建议
4.inline不建议声明和定义分离,inline是一种“用于实现的关键字”,而不是“用于声明的关键字”。(直接在.h文件中定义)
5.inline函数是不进符号表的

上链接知乎大佬

0x03.类和对象

1.this指针

1.1C++给每个非静态成员函数增加了一个隐式的指针参数,即this指针,让该指针指向当前对象,在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要传递,编译器自动完成.
1.2.this指针的特性

2.默认成员函数

2.1构造函数

class Date
{
 public:
   // 1.无参构造函数
   Date()
  {}
   // 2.带参构造函数
   Date(int year, int month, int day)
  {
     _year = year;
     _month = month;
     _day = day;
  }
 private:
   int _year;
   int _month;
   int _day;
};

1.函数名与类名相同,无返回值,对象实例化时编译器自动调用构造函数,可以重载。
2.如果类中没有显示定义构造函数,则c++编译器会自动生成一个无参的默认构造函数,一旦用户显示定义编译器将不再生成。对于自定义类型会调用其的默认成员函数。(C++11允许内置类型成员变量在声明时给默认值)
3.无参的构造函数和全缺省的构造函数和编译器自己生成的都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。

Date()
{
_year = 1900;
_month = 1;
_day = 1;
}
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}

2.2析构函数

对象销毁时会自动调用析构函数,完成对象中资源的清理工作
和构造函数差不多,如果未显示定义,会自动生成默认的析构函数。对内置类型不做处理,如果有自定义类型,则会调用对应的析构函数。

2.3拷贝构造

1.拷贝构造实际上是构造函数的重载形式
2.拷贝构造的参数只有一个且必须使用传引用传参,使用传值方式会引发无穷递归

class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)//构造函数
	{
		_year = year;
		_month = month;
		_day = day;
	}
	

	Date(Date d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1;
	Date d2(d1);
	return 0;
}

如上面的传值拷贝就会报错
在这里插入图片描述
原因:用d1对象构造d2,要去调用拷贝构造函数,因为是传值调用,我们要把d1赋值给形参d,再次调用拷贝构造函数,因为参数会拷贝一份实参,调用了d的拷贝构造函数,需要把参数传给d,而此时传给d又要调用拷贝构造函数,如此反复,从而发生无限递归。
在这里插入图片描述

文章来源:https://blog.csdn.net/m0_73865858/article/details/135505437
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。