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     public4         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 }     

注意:

  • 友元不能被继承;
  • 友元关系不能传递;
  • 友元关系是单向的;

 

posted @ 2019-12-31 14:45  All_just_for_fun  阅读(151)  评论(0编辑  收藏  举报