1.使用类型别名来简化类
Example:class A
{
public:
typedef string::size_type MyType;
private:
MyType x;
};
Tips:类型别名的定义必须出现在其使用之前,例如,下面的的代码为非法的
class A
{
private:
MyType x; //error,MyType尚未定义
public:
typedef string::size_type MyType;
};
2.this指针
class A
{
public:
A& f()
{
cout<<this<<endl;
cout<<&x<<endl;
return *this;
}
private:
int x;
};
int main ()
{
A a;
cout<<&a.f()<<endl; //首先调用a.f(),输出this指针的值,x地址的值,
//最后返回对象a的引用,并输出的地址的值。可见,三者的值时相同的
cout<<endl;
A b;
cout<<&b.f()<<endl;
return 0;
}
从输出结果可以看出,每个对象都有各自的this指针,this指针保存的是对象的地址,
归根到底,this指针保存的是对象第一个数据成员的地址
3.类定义实际上是在两个阶段中处理:
1)首先,编译成员声明
2)只有在所有成员出现之后,才编译它们的定义本身。
4.构造函数分两个阶段执行
1)初始化阶段
2)普通的计算阶段(构造函数体重的所有语句组成)
Tips:
不管成员是否在构造函数初始化列表中显示初始化,类类型的数据成员总是在初始化阶段初始化。
Example:
class A
{
public:
A(string s)
{
str=s; //在赋值之前,str已经被初始化为空串
}
private:
string str;
};
Tips:没有默认构造函数的类类型的成员,以及const或引用类型的成员,都必须在构造函数初始化列表中进行初始化
Example:
class A
{
public:
A(int i)
{
x=i;
}
private:
int x;
};
class B
{
public:
B():a(1){} //a没有默认构造函数,必须在初始化列表中进行初始化
private:
A a;
};
5.初始化式可以使任意表达式
Example:
class A
{
public:
A(int i,int j):x(i),y(j),z(i*j){}
private:
int x;
int y;
int z;
};
6.类成员的显示初始化化
对于没有定义构造函数并且全体成员均为public的类,可以采用与初始化数组元素相同的方式初始化其成员
Example:
class A
{
public:
int x;
int y;
};
A a={1,2};
7.使其它类的成员函数成为友元
Example:
class B;
class A
{
public:
void f(B &b); //函数的定义必须在类B完全定义之后
};
class B
{
friend void A::f(B &b);
public:
B(int i):x(i){}
private:
int x;
};
void A::f(B &b)
{
cout<<b.x<<endl;
}
8.static 成员函数不能被声明为cosnt或者虚函数