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.类内构造函数列表:

Date::Date(int y,int m,int d):year(y),month(m),day(d)
{
xxx
}

4.构造函数与析构函数:
4.1.构造函数可以重载,而析构函数只有一个无参无返回类型函数
4.2.程序若不主动使用析构函数,等到程序中止时自动调用析构函数,并且析构函数调用次序与构造函数相反

5.复制构造函数:(默认的复制构造函数为浅复制,自定义要用深复制,防止引用或指针指向同一个地址)
5.1.格式:
类名::类名(const 类名& 引用名)
{
xxx
}
5.2.复制构造函数在三种情况下被调用:
5.2.1.初始化时:
Date date2(date1);
Date date2 = date1;
5.2.2.实参传递给形参:
Date fun(Date d)
{
xxx
}
5.2.3.函数返回值:
Date fun(Date d)
{
xxx
}

6.数组析构与构造相反:(先构造的后析构,后构造的先析构)
delete[] p;

7.this指针:
对象在调用成员函数时,先将对象地址赋值给this指针,再用this调用成员对象。
date1.showDate();
void showDate()
{
cout<<(*this).day<<endl;
}

8.静态数据成员和静态成员函数:static
8.1.都归类所有的而非对象私有,定义时都要加static
8.2.静态数据成员必须在类外定义:
int Point::count = 0;
8.3.静态成员函数只能访问静态数据成员和函数,可用参数传递方式调用非静态成员,可以在类内或类外定义:
void Point::Display(Point& p)
{
xxx
}

9.常对象,常成员函数,常数据成员:const
9.1.常对象:const A a(1,2); 等价于 A const a(1,2); a为只读变量
9.2.常成员函数:
类中声明时:int GetDay() const;
类外定义时:inline int Date::GetDay() const{xxx}
9.3.常数据成员:
必须在构造函数的初始化列表中显示定义:
Date::Date(int d):day(d){xxx}
注意:
常成员函数不可以修改数据成员;
常对象只能调用常成员函数;
一般对象既可以调用常成员函数又可以调用一般成员函数;
对于不修改的成员函数最好定义为const成员函数;
重载时一般对象先调用一般函数若无一般函数则调用常成员函数;

10.友元函数、友元类和友元成员函数:
10.1.友元函数:
普通函数为一个类的友元函数(不是类成员函数却能够访问类的所有成员的函数):
class A
{
public:
friend void set_show(int x, A &a);
};
10.2.友元类:C类可访问A类成员
class A
{
public:
friend class C;
};

Class C
{
xxx
};
10.3.友元成员函数:
B类成员为A类友元
class A;
class B
{
public:
void set_show(int x,A &a);
};

class A
{
public:
friend void B::set_show(int x,A &a);
};

void B::set_show(int x,A &a)
{
xxx
}
注意:
友元不能被继承;
友元关系不能传递;
友元关系是单向的;

猜你喜欢

转载自www.cnblogs.com/zhihaospace/p/12124385.html