this指针
1)非静态成员函数中能直接使用this代表指向该函数作用的对象的指针
例如:
class complex{
public:
double real, imag;
void print(){
cout << real << ',' << imag << endl;
}
complex(double r, double i) :real(r), imag(i){}
complex addone(){
this->real++;//等价与将函数作用对象的real++
this->print();//等价于调用print()函数作用与addone()函数作用的对象
return *this;
}
};
int main(){
complex c1(1, 1), c2(2, 2);
c2 = c1.addone();
c2.print();
return 0;
}
输出:
2,1
2,1
2)因为静态成员函数不作用与具体的某个对象,所以静态成员函数不能使用this指针
静态成员
1)在静态成员前加上static
例如:
class complex{
private:
int w, h;
static int ntotalare;//静态成员变量
static int ntotalnumber;//静态成员变量
public:
complex(int w, int h);
~complex();
static void ptinttotal();//静态成员函数
};
2)普通成员变量每个对象都有一份,而静态成员变量一共就一份
3)普通成员函数必须具体作用与某个对象,而静态成员函数不具体作用与某个对象
4)静态成员不需要对象就能访问
例如:
类名::成员名
complex::ptinttotal();
对象名.成员名
complex r;
r.ptinttotal();
指针->成员名
complex r;
complex *p = &r;
p->ptinttotal();
引用.成员名
complex r;
complex &p = r;
p.ptinttotal();
5)静态成员变量本质是全局变量
6)静态成员函数本质是全局函数
示例:
考虑一个需要随时知道矩形总数和总面积的图形处理程序
class crectangle{
private:
int w, h;
static int ntotalarea;
static int ntotalnumber;
public:
crectangle(int w_, int h_);
crectangle(crectangle & r);
~crectangle();
static void printtotal();
};
crectangle::crectangle(int w_, int h_){
w = w_;
h = h_;
ntotalnumber++;
ntotalarea += w*h;
}
crectangle::crectangle(crectangle & r){
w = r.w;
h = r.h;
ntotalnumber++;
ntotalarea += w*h;
}
crectangle::~crectangle(){
ntotalnumber--;
ntotalarea -= w*h;
}
void crectangle::printtotal(){
cout << ntotalarea << ',' << ntotalnumber << endl;
}
int crectangle::ntotalarea = 0;
int crectangle::ntotalnumber = 0;
//必须对静态成员进行说明
int main(){
crectangle r1(3, 3), r2(1, 1);
crectangle::printtotal();
r1.printtotal();
return 0;
}
7)在静态成员函数中不能访问非静态成员变量,也不能调用非静态成员函数
成员对象和封闭类
1)有成员对象的类称之为封闭类
2)任何生成封闭类对象的语句,都要让编译器知道封闭类中的成员对象如何初始化
3)方式:封闭类构造函数的初始化列表
4)封闭类对象生成时,先执行成员对象的构造函数,在执行封闭类的成员函数
5)对象成员构造函数的顺序与其在封闭类中的说明顺序一致
6)封闭类对象消亡时,先执行封闭类的析构函数,再执行成员对象的析构函数
示例:
class Ctyre{
public:
Ctyre(){
cout << "Ctyre constructed" << endl;
}
~Ctyre(){
cout << "Ctyre destructed" << endl;
}
};
class Cengine{
public:
Cengine(){
cout << "Cengine constructed" << endl;
}
~Cengine(){
cout << "Cengine destructed" << endl;
}
};
class Ccar{
private:
Cengine engine;
Ctyre tyre;
public:
Ccar(){
cout << "Ccar constructed" << endl;
}
~Ccar(){
cout << "Ccar destructed" << endl;
}
};
int main(){
Ccar car;
return 0;
}
输出:
Cengine constructed
Ctyre constructed
Ccar constructed
Ccar destructed
Ctyre destructed
Cengine destructed
7)封闭类对象如果用默认复制构造函数初始化,那么其成员对象也会用复制构造函数初始化
例如:
class A{
public:
A(){
cout << "default" << endl;
}
A(A& r){
cout << "copy" << endl;
}
};
class B{
A a;
};
int main(){
B b1;
B b2(b1);
return 0;
}
输出:
default
copy
友元
1)友元分为友元类和友元函数
2)如果A是B的友元类,则A的成员函数可以访问类B的私有成员