*成员初始化表格式:
构造函数名(参数表) :类中成员名(初值),类中成员名(初值),…{函数体};
※ 防止本参数误写参数变量:
返回值类型 函数名(const 参数,const 参数,…);
※ 防止本函数误写类对象内全部的变量:
返回值类型 函数名 (参数表) const;
※ 防止其他函数误写返回地址或引用的:
const 返回值类型 函数名 (参数表);
*拷贝构造函数(用对象初始化另一对象时 ,自动调用)
特点:与类同名,不指定返回;只有1个参数,是类对象的引用.
格式: 〈类名〉:: <拷贝构造函数名>(<类名> & <引用名>) {<函数体>}
class Demo{
public:
Demo(const char *s) {…};//构造函数
Demo(const Demo &st){…};//拷贝构造函数
Demo(){…};//不会自动执行
~Demo(){…}//析构函数
};
…
Demo h(“first”);
Demo r=h;//将对象h的全部成员数据内容复制到对象r内
//如果写成 Demo r; r=h; 则不会调用拷贝构造函数
※如果不想编写拷贝构造函数和赋值函数,又不允许别人使用编译器生成的缺省函数,怎么办?可以将拷贝构造函数和赋值函数声明为私有函数,不用编写代码。如:
class A
{……
private:
A (const A &a);//私有的拷贝构造函数
A & operate =(const A &a);//私有的赋值函数
};
如果写成如下程序:
A b(a);//调用了私有拷贝构造函数
b = a; //调用私有赋值函数
编译器将指出错误,因为外界不可以操作A的私有函数。
*友元函数
在成员函数名前加上friend,就成了可访问类私有成员的非成员函数,它在定义和调用上和普通函数一样。