2.C++面向对象补充1
C++语言:
- 类包含:数据成员+成员函数+访问控制
- 访问控制:public,protect,private
1.自身类的对象不可以作为自身类的成员存在,但可以是自身类的指针:
1 例: 2 错误用例: 3 class Date 4 { 5 Date dates; 6 }; 7 正确用例: 8 class Date 9 { 10 Date* dates; 11 };
2.类内定义函数默认为内联函数inline,类外定义函数必须显示使用inline才为内联函数。
3.类内构造函数列表:
1 Date::Date(int y,int m,int d):year(y),month(m),day(d) 2 { 3 xxx 4 }
4.构造函数与析构函数:
4.1.构造函数可以重载,而析构函数只有一个无参无返回类型函数
4.2.程序若不主动使用析构函数,等到程序中止时自动调用析构函数,并且析构函数调用次序与构造函数相反
5.复制构造函数:(默认的复制构造函数为浅复制,自定义要用深复制,防止引用或指针指向同一个地址)
5.1.格式:
1 类名::类名(const 类名& 引用名) 2 { 3 xxx 4 }
5.2.复制构造函数在三种情况下被调用:
5.2.1.初始化时:
1 Date date2(date1); 2 Date date2 = date1;
5.2.2.实参传递给形参:
1 Date fun(Date d) 2 { 3 xxx 4 }
5.2.3.函数返回值:
1 Date fun(Date d) 2 { 3 xxx 4 }
6.数组析构与构造相反:(先构造的后析构,后构造的先析构)
1 delete[] p;
7.this指针:
对象在调用成员函数时,先将对象地址赋值给this指针,再用this调用成员对象。
1 date1.showDate(); 2 void showDate() 3 { 4 cout<<(*this).day<<endl; 5 }
8.静态数据成员和静态成员函数:static
8.1.都归类所有的而非对象私有,定义时都要加static
8.2.静态数据成员必须在类外定义:
1 int Point::count = 0;
8.3.静态成员函数只能访问静态数据成员和函数,可用参数传递方式调用非静态成员,可以在类内或类外定义:
1 void Point::Display(Point& p) 2 { 3 xxx 4 }
9.常对象,常成员函数,常数据成员:const
9.1.常对象:const A a(1,2); 等价于 A const a(1,2); a为只读变量
9.2.常成员函数:
1 类中声明时:int GetDay() const; 2 类外定义时:inline int Date::GetDay() const{xxx}
9.3.常数据成员:
必须在构造函数的初始化列表中显示定义:
1 Date::Date(int d):day(d){xxx}
注意:
- 常成员函数不可以修改数据成员;
- 常对象只能调用常成员函数;
- 一般对象既可以调用常成员函数又可以调用一般成员函数;
- 对于不修改的成员函数最好定义为const成员函数;
- 重载时一般对象先调用一般函数若无一般函数则调用常成员函数;
10.友元函数、友元类和友元成员函数:
10.1.友元函数:
普通函数为一个类的友元函数(不是类成员函数却能够访问类的所有成员的函数):
1 class A 2 { 3 public: 4 friend void set_show(int x, A &a); 5 };
10.2.友元类:C类可访问A类成员
1 class A 2 { 3 public: 4 friend class C; 5 }; 6 7 Class C 8 { 9 xxx 10 };
10.3.友元成员函数:
1 B类成员为A类友元 2 class A; 3 class B 4 { 5 public: 6 void set_show(int x,A &a); 7 }; 8 9 class A 10 { 11 public: 12 friend void B::set_show(int x,A &a); 13 }; 14 15 void B::set_show(int x,A &a) 16 { 17 xxx 18 }
注意:
- 友元不能被继承;
- 友元关系不能传递;
- 友元关系是单向的;