C++类与对象提高

本文深入解析C++中的this指针概念,解释其在非静态成员函数中的应用,以及为何不能在静态成员函数中使用。同时,详细阐述静态成员变量和函数的特点,包括它们的共享性质、访问方式及限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • this指针

先看C++程序到C程序的翻译过程:

this指针的作用:指向成员函数所作用的对象。

非静态成员函数中可以直接使用this指针来代表指向该函数作用的对象的指针。

静态成员函数中不能使用this指针;

因为静态成员函数并不具体作用于某个对象,

因此,静态成员函数的真实的参数的个数,就是程序中写出的参数个数。

例题:

下列说法不正确的是:

1、静态成员函数中不能使用this指针

2、this指针就是指向成员函数所作用的对象的指针

3、每个对象的空间中都存放着一个this指针

4、类的非静态成员函数,其真实的参数个数比所写的参数多1

正确答案:3.

  • 静态成员

在定义前加了static关键字的成员。

普通成员变量每个对象都有各自的一份,而静态成员变量一共就一份,为所有对象共享。

sizeof不会计算静态成员变量。

例如:

class CMyclass{
    int n;
    static int s;
};

sizeof(CMyclass)等于4.

普通成员函数必须具体作用于某个对象,而静态成员函数并不具体作用于某个对象。

因此静态成员不需要通过对象就能访问。

如何访问静态成员?

1、类名::成员名

2、对象名.成员名

3、指针—>成员名

4、引用.成员名

静态成员变量本质上是全局变量,哪怕一个对象都不存在,类的静态成员变量也存在。

静态成员函数本质上是全局函数

上面程序的输出结果是:

2,13

2,13

注意:在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数

  • 成员对象和封闭类

有成员对象的类叫做封闭类。

上例中,如果CCar类不定义构造函数,则下面的语句会编译出错:

CCar car;

因为编译器不明白car.tyre该如何初始化,car.engine的初始化没问题,用默认的构造函数即可。

注意:任何生成封闭类对象的语句,都要让编译器明白,对象中的成员对象,是如何初始化的。

具体的做法就是通过封闭类的构造函数初始化列表

封闭类实例:

封闭类构造函数和析构函数的执行顺序:

封闭类对象生成时,先执行所有对象成员的构造函数,然后才执行封闭类的构造函数。

对象成员的构造函数调用次序和对象成员在类中的说明顺序一致,

当封闭类的对象消亡时,先执行封闭类的析构函数,然后再执行成员对象的析构函数。

  • 封闭类的复制构造函数

封闭类的对象,如果是用默认复制构造函数初始化的,那么它里面的包含的成员对象,也会用复制构造函数初始化。

  • 友元

友元分为友元函数和友元类两种。

友元函数:一个类的友元函数可以访问该类的私有成员。

可以将一个类的成员函数(包括构造、析构函数)说明为另一个类的友元。

友元类:如果A是B的友元类,那么A的成员函数可以访问B的私有成员。

友元类之间的关系不能传递,不能继承。

  • 常量成员函数

如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加const关键字。

在类的成员函数说明后面可以加const关键字,则该成员函数成为常量成员函数。

常量成员函数内部不能改变属性的值,也不能调用非常量成员函数。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值