1.构造函数(三)
构造函数在用一个成员来初始化另一个成员的时候,一定要注意顺序。初始化顺序要跟成员的声明顺序一致。如以下代码是未定义的。
class A{
private:
int i;
int j;
public:
A(int k):j(k),i(j){ }
};
初识化顺序与成员声明顺序相同。因此这段代码的意思是:用未初始化的j来初始化i!
我们应该这样改:
A(int k):i(k),j(i){ }
1.1默认构造函数
当一个类有多个构造函数时,默认构造函数时不可少的。请注意!
class A{
public:
A()=default;//如有其它构造函数,此函数必须!
//...
};
2.重载运算符
重载运算符不建议经常使用,但是必要时还是可以的。
重载运算符不可以创造运算符
2.1.重载运算符与this指针
在类的内部,有一个名为this的隐式指针。它指向获取成员的对象。因此,我们在类内重载运算符的时候,要特别注意this指针是一个隐式指针。
class A{
public:
operator+(A&);
//隐式为(A&,*this)
//...
};
2.2.重载运算符与成员函数
有些运算符必须为成员函数。如:[]
等。还有几个运算符不可重载:. .* ?:
3.编译器处理类在int main()中的成员调用与获取
3.1.this指针
这一切与this指针还是脱不了干系。实际上,编译器在处理成员函数的时候,会自动的加上一个实参:const *this
。因此,有如下代码:
class A{
public:
ostream& print(const string=" ");
};
int main()
{
A a;
a.print();
};
编译器将翻译为:
ostream& print(const string=" ");
//伪代码
print(&a);
此时*this=&a;
如有错误,请在评论中提出。
感谢!!!