参考:
https://www.runoob.com/cplusplus/cpp-tutorial.html
和gpt生成的内容
类声明
类的成员函数的实现可以在类内(非常简短的情况下),也可以在类外部实现(通常做法)。
class Fruit {
public: void peel();
private: int weight, calories_per_oz;
};
// 类的实例
Fruit melon;
// 成员函数在类外部的实现,返回值 类名::函数名(参数列表){实现}
void Fruit::peel() {
...
}
// 外部调用函数使用.
melon.peel();
使用类指针访问变量时,不用.用- >
构造函数
类的构造函数在每次创建类的新对象时执行,默认的是与类同名,不返回也没有参数的。
在构造函数中,可以使用初始化列表来初始化字段。
假设有一个类C,有多个字段需要初始化,则可以这样写:(其中XYZ是类的数据成员的名字,abc是形参)
C::C( double a, double b, double c): X(a), Y(b), Z(c)
{
....
}
析构函数
在每次删除所创建的类对象时执行。跟构造函数的区别是前面多一个~,同时不能带参数。用来在删除对象的时候关闭文件、释放资源等,并且还要清理对象所持有的锁。
拷贝构造函数
通常用于:
- 使用另一个同类型对象来初始化新建的对象(eg: 等号赋值)
- 函数的形参使用对象,此时需要复制对象,再传递给函数
- 函数需要返回一个对象,此时需要复制对象
如果类没有定义拷贝构造函数,编译器会自行定义一个。但如果类带有指针变量,并有动态内存分配,那么就必须定义一个拷贝构造函数。
ClassName(const ClassName &obj){}
友元
友元可以是一个函数也可以是一个类。友元是类的时候,整个类及其所有成员都是友元。
属于friend但不属于类成员的函数,可以像类成员一样访问类的private和protected成员。
举例1:友元函数
假设一个函数printWidth是Box的友元函数,它是不属于任何类的,但是需要在Box中放置printWidth的声明。
#include <iostream>
using namespace std;
class Box
{
double width;
public:
friend void printWidth( Box box );
void setWidth( double wid );
};
// 成员函数定义
void Box::setWidth( double wid )
{
width = wid;
}
// 请注意:printWidth() 不是任何类的成员函数
void printWidth( Box box )
{
/* 因为 printWidth() 是 Box 的友元,它可以直接访问该类的任何成员 */
cout << "Width of box : " << box.width <<endl;
}
// 程序的主函数
int main( )
{
Box box;
// 使用成员函数设置宽度
box.setWidth(10.0);
// 使用友元函数输出宽度
printWidth( box );
return 0;
}
举例2:友元类
声明类ClassTwo是ClassOne的友元,需要在ClassOne中放置这样的声明:
friend class ClassTwo;
静态成员
- 如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零
- 不能把静态成员变量的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化,例如int Box::objectCount = 0;
- 如果把函数成员声明为静态的,那么即使类对象不存在,也能使用“类名::函数名”调用
- 静态成员函数只能访问静态成员数据、其他静态成员函数和类外部的其他函数。
- 静态成员函数不能访问类的 this 指针。
this指针
每个成员函数都有一个this指针参数,它允许在函数内部引用对象本身。它的用处是如果某个成员变量与函数形参或者局部变量重名,那可以用this来区分一下。
void Fruit::peel() {
cout << this << endl; // 指针地址
cout << weight << endl;
this->weight--;
cout << weight << endl;
}
内联函数
- 如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放在每个调用该函数的地方。所以,每次修改内联函数时,都需要重新编译以更换代码。
- 内联函数就一行,如果函数内容超过一行,编译器会忽略inline限定符
- 在类定义中定义的函数都是内联函数,即使没有inline限定符
- 定义内联函数就是在函数前面放置inline关键字
访问控制
- 默认情况下,类的所有成员都是私有的
- public继承:成员的属性在派生类中保持不变;protected继承:public成员的属性在派生类中变成protected,其他不变;private继承:public和protected成员的属性变成private。总之,private是无论怎么继承都不会变的,只能被类成员和友元访问