C++ 大学MOOC 北大课程(郭炜老师)听课整理 第三周

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的私有成员

发布了16 篇原创文章 · 获赞 17 · 访问量 759

猜你喜欢

转载自blog.csdn.net/weixin_45644911/article/details/104147647