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
}
注意:
友元不能被继承;
友元关系不能传递;
友元关系是单向的;