【C++】类②
一、类访问修饰符
- public(公有): 类的内部和类的外部都能访问共有成员
- private(私有):只有类的内部和类外的友元函数可以访问私有成员
- protected(受保护):类的内部和类外的友元函数可以访问受保护成员,并且受保护成员在派生类(即子类)中是可访问的
二、构造函数与析构函数
1. 类的 构造函数 是类的一种特殊的成员函数,它会在每次创建类的新对象时执行
构造函数可用于为某些成员变量设置初始值
它与普通的成员函数在形式上有两个区别:构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void
注:构造函数可以带有参数
class student
{
int score;
student();
};
student::student()
{
cout<<score;
}
2. 类的 析构函数 是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行
析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源
它与普通的成员函数在形式上有三个区别:析构函数的名称与类的名称是完全相同的,它不会返回任何值,只是在前面加了个波浪号(~)作为前缀
注:析构函数不能带有任何参数
class student
{
int score;
~student();
};
student::~student()
{
cout<<score;
}
3. 拷贝构造函数
拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于:
-
通过使用另一个同类型的对象来初始化新创建的对象。
-
复制对象把它作为参数传递给函数。
-
复制对象,并从函数返回这个对象。
如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数
拷贝构造函数在类内的声明:classname (const classname &obj);
拷贝构造函数在类外的定义:classname::classname (const classname &obj) { 拷贝构造函数的主体 }
4. 总结
类中的成员函数有三种:
- a.普通函数
- b.构造函数
- c.拷贝构造函数
- d.析构函数
而每种成员函数都有两种定义方法:
- a.在类内声明函数,在类外定义函数
- b.直接在类内定义函数
三、友元函数
友元函数既可以是不属于任何类的非成员函数,也可以是另一个类的成员函数。友元函数不是当前类的成员函数,但它可以访问该类的所有成员,包括私有成员、保护成员和公有成员。
在类中声明友元函数时,需要在其函数名前加上关键字friend。此声明可以放在公有部分,也可以放在保护部分和私有部分。友元函数可以定义在类内部,也可以定义在类外部。
在类内声明友元函数与在类内声明普通函数几乎相同,唯一的不同在于当声明友元函数时前面要有个friend关键字,而在类外定义友元函数与在类外定义普通成员函数唯一的区别在于在类的外部定义友元函数时,不必像成员函数那样,在函数名前加上“类名::”。
1.友元函数虽然可以访问类对象的私有成员,但他毕竟不是成员函数。因此,在类的外部定义友元函数时,不必像成员函数那样,在函数名前加上“类名::”。
2.因为友元函数不是类的成员,所以它不能直接访问对象的数据成员,也不能通过this指针访问对象的数据成员,它必须通过作为入口参数传递进来的对象名(或对象指针、对象引用)来访问该对象的数据成员。
3.友元函数提供了不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。尤其当一个函数需要访问多个类时,友元函数非常有用,普通的成员函数只能访问其所属的类,但是多个类的友元函数能够访问相关的所有类的数据。