构造函数
可以有多个,重载
complex(double r,double i):re(r),im(i){ // initialization list 初始化
} // only for constructor
构造函数放在 private,外界就不能创建对象
const member functions
不会改变数据的函数,要习惯的加上 const
double real() const{return re;} // 对不会改变数据的函数,要习惯 加上const
double imag() const{return im;}
如果不加 const
const complex c1(2,1); // 常对象
cout<<c1.real(); // Error,只能访问 const 修饰的成员
this pointer
成员函数有一个隐藏的参数,this pointer,编译器会自动帮我们写
因为有这个东西,所以可以在函数里面去用它
double real() const{
return this->re; // 也可以 return re; 编译器会自动补充上
}
static 成员
static 成员 和对象是脱离的,不属于对象
static 数据 要在类外 给 definition double Account::m_rate=8.0;
static 函数 和 一般的函数 的差别是static 函数 没有 this pointer,所以只能处理static数据
友元
友元函数:一个类的友元函数可以访问这个类的私有成员
友元函数不是这个类的成员函数,是这个类的朋友。
class CCar; // 声明 CCar类,方便CDriver类里使用
class CDriver{
public:
void ModifyCar(CCar *p);
};
class CCar{
private:
int price;
// 进行声明
friend int Most_Expensive_Car(CCar cars[],int total);
friend void CDriver::ModifyCar(CCar *p);
};
void CDriver::ModifyCar(CCar *p){
p->price+=1000; // 友元函数里可直接访问 私有变量
}
int Most_Expensive_Car(CCar cars[],int total){
for(int i=0;i<total;i++){
if(cars[i].price>tem){
tem=cars[i].price; // 直接访问私有成员
}
}
}
友元类:如果A是B的友元类,则A的成员函数 可以访问 B类的私有成员。
class CCar{
private:
int price;
friend class CDriver; // 声明 友元类
};
class CDriver{
public:
CCar myCar;
void ModifyCar(){
myCar.price+=1000; // OK
}
};
// 如果 CDriver 不是 CCar 的友元,尽管定义了myCar,也不能 访问其私有成员。
程序中的友元关系是单向的。
namespace
为了解决 名字冲突的问题,namespace作为附加信息来区分不同库中相同名称的函数、类、变量等。
使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。