C++——构造函数(拷贝构造,拷贝复制),析构函数,操作符重载
构造函数与析构函数::
涉及构造函数还可以看这篇文章C++搞懂深拷贝初始化=与赋值=的区别
1、声明和定义构造函数和析构函数
构造函数在定义类对象时会自动被调用,在对象声明结束时析构会自动被调用
class name{
private:
int a,b;
public:
name(int x,int y);//构造声明
~name();//析构声明
}
name::name(int x=0,int y=0):a(x),b(y){//构造定义
}
name::~name(){//析构定义
}
如果类里没有定义任何构造函数,name B;
表示C++编译器将调用默认无参构造函数;而且要求类里必须无任何构造函数,编译器才会调用默认存在的。
构造函数有有参有无参的,当仅有参构造函数存在时,若有参构造函数不存在默认参数,则定义对象时name B;
则会失败,因为不会调用编译器的默认无参构造函数。有参构造函数和函数一样(除了没有返回值)根据自己的想法定义;
析构函数一般和delete搭配使用,用来释放内存;析构函数没有参数;
只要类成员函数不改变调用对象就应该声明为const类型;
2、构造函数与赋值的一些使用
以下几种情况调用:
name TT=name(2,1);//1
TT = name(3,4);//2
1的使用可能有两种情况,不同编译器可能不同,第一种创建一个临时对象,把值赋给TT再析构,第二种创建TT对象;2只有一种情况创建临时对象赋值给TT,临时对象析构;
3、列表初始化
name TT={2,1};
name TT{2,1};
参数与构造函数参数匹配;
4、this指针
一个指向类自己的指针,用来调用类成员或者方法;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KhXKXuQR-1624432362592)(
5、对象数组
对象可以以数组的方式创建:
6、类作用域
侯捷C++总结:
注意:
1、:
:号后初始化时构造函数
独有的写法。侯捷:这是初始化,如果放入大括号里面,虽然参数也传了进去,但时间晚了些,效率也差了些。这个语法作用是初始化
2、默认参数
double r=0,double =0;0是默认参数,如果没有,则必须写默认无参构造函数,否则如果在初始化时无法调用默认无参构造函数,造成错误。也可以不写构造函数,编译器自动生成默认无参构造函数,
3、构造函数重载
构造函数可以重载overloding
,但下图不可以同时存在,complex c;
可以调用①也可以调用②,①与②冲突。
4、函数重载
函数重载
,只与形参类型和数量有关,与返回值无关看下图
可以把中间文件xxx.s打开查看,会发现,
5、构造函数位置
构造函数一般不放在private里,也有例外,比如下图
,放在private则不能被外界创建,
上图只存在一份A
6、const
class里的const,即成员函数后面加个const相当于const this(this指针),不允许改变class里的内容
7、参数传递值传递vs引用传递
参数传递值传递vs引用传递
,值传递需要开辟额外的栈内存,引用只需要开辟指针大小的栈内存即可
。尽量传参传引用,引用相当于变量的另一个名,笔者认为,值传递也有好用的地方,比如这个值变化会影响其他内容,如果不影响且不改变该变量值尽量引用,比如回溯算法里的递归,最终结果用引用,中间的一些变量用值传递。比如力扣
剑指 Offer 38. 字符串的排列
8、返回值传递,如果可以尽量返回引用。
9、友元,友元函数可以用私有数据
解决了我以前遇到的疑惑,讲的太细了。看下图:
10、什么情况下可以传引用(上面有讲)?什么情况下可以返回引用?
函数的操作结果放在已有内存位置还是新创建内存位置。如果函数操作结果放在本函数local位置,函数结束local被释放,则不能指针与引用。
操作符重载
可以看我的另一篇博客C++——运算符重载operator
临时对象:typename();
<<的重载,看例子
ostream标准输出类;
侯捷C++拷贝构造,拷贝赋值,析构
参考:《C++ prime plus》《C++ 程序设计语言》《侯捷C++面向对象高级开发》