直接初始化与赋值初始化
最近在看《c++ primer》看到初始化与赋值的区别。它说初始化是创建变量并给变量赋初值,而赋值是擦除对象的当前值并用新值代替。然后看了一些例子,感觉对两者的区别比较清楚了,但是看到后来关于直接初始化与赋值初始化又有点不明白了。
直接初始化还好说,关于类的赋值初始化它说会先调用类的默认构造函数,然后再调用类的复制构造函数。比如给一个string使用赋值初始化 string st="abc"; 那么st会先由string类的默认构造函数初始化为空,然后再由复制构造函数将其值初始化为"abc"。这样一来不就是上面说的擦除当前值(空)然后用新值("abc")代替吗?
类的赋值初始化和赋值有什么区别呢?怎样区分?
[解决办法]
#include<iostream>#include<vector>#include<string>using namespace std;class student{public: student() { cout<<"默认构造函数"<<endl; } student(const student&) { cout<<"复制构造函数"<<endl; } student &operator=(const student &) { cout<<"赋值操作符"<<endl; return *this; } ~student() { cout<<"析构函数"<<endl; }}; //形参为student对象 void fun1(student obj) { } //形参为student对象的引用 void fun2(student &obj) { } student fun3() { student obj; return obj; }int main(){ cout<<"student a"<<endl; student a; cout<<"fun1(a);"<<endl; fun1(a); cout<<"fun2(a);"<<endl; fun2(a); cout<<"a=fun3();"<<endl; a=fun3(); cout<<"student *p=new student;"<<endl; student *p=new student; cout<<"vector<student> even(3);"<<endl; vector<student> even(3); cout<<"delete p"<<endl; delete p; cout<<"student b=a;"<<endl; student b=a; cout<<"student c;c=a; "<<endl; student c; c=a; system("pause"); return 0;}
[解决办法]
“赋值初始化和赋值的区别是一个调用复制构造函数,一个调用赋值操作符”
这个,是区别导致的结果,而关键是为啥要有这个区别。