c++复习-面向对象-类和对象

参考:
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是无论怎么继承都不会变的,只能被类成员和友元访问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值