1.对于一个类 ,如果你没有自己生成任何构造函数 那么编译器起始会默认生成四个函数 如下
class AA{
};//定义一个空类,其本质上等价的是
class AA{
public:
AA()=default
AA(const AA& kk){
.....
}
operator=(const AA& kk){
...
}
~AA(){
......
}
};
只有这些函数需要被调用时才会被创建出来,还要注意的就是 编译器创造的默认析构函数不是虚函数,而对于重载运算符=则是只能对非static对象使用。
2.对于string类的引用 是不能用c风格字符串来初始化和赋值的 因为const char*不能转化为string&类 所以可以对const string&用c风格字符串来初始化和赋值的。
string x("nihao");
string & y=x;//可以
string & mm("deded")//错误
const string & mm("deded")//正确;
3.在类中 成员变量有非const string引用类别 并且没有定义重载copy符 不能直接赋值 因为C++中不允许让引用改指向不同对象
#include<iostream>
#include<vector>
using namespace std;
class A {
public:
A(string &m_1):x(m_1){}
void operator=(A& c);
void show() {
cout << x << endl;
}
private:
string& x;
};
int main() {
string dd("ddw");
string cc("deded");
A a(dd);
A d(cc);
a = d;//若未重载= 直接a=d是错误的
a.show();
return 0;
}
void A::operator=(A& mt) {
this->x = mt.x;
}
一定要养成定义重载和调用显示构造函数的习惯 拒绝调用编译器默认生成的函数并且尽可能用string类 不要用c风格字符串