【C++同步练习】类和对象(一)

🫧个人主页:小年糕是糕手

💫个人专栏:《C++》《C++同步练习》《数据结构》《C语言》

🎨你不能左右天气,但你可以改变心情;你不能改变过去,但你可以决定未来!



目录

一、this指针

二、构造函数

三、析构函数


一、this指针

知识回顾:

  1. 本质 :类的非静态成员函数中隐含的指针,指向当前调用该函数的对象,是成员函数访问自身对象的桥梁。
  2. 核心目的:区分成员变量与局部变量(同名时),以及在成员函数中操作当前对象。
  3. 基本用法 :
    1. 成员函数内可直接用this->成员访问当前对象的成员(如this->a = 10;,a 是类的成员变量);
    2. 用于返回当前对象(如return *this;,实现链式调用)。
  4. 规则 :
    1. 仅在类的非静态成员函数中存在,静态成员函数、全局函数中无 this 指针;
    2. this 指针是函数的隐含参数,无需显式声明,由编译器自动传递;
    3. this 指针的类型是类类型* const(普通成员函数)或const 类类型* const(const 成员函数),不可修改指向。
      1、下面描述错误的是()

A.this指针是非静态成员函数的隐含形参

B.每个非静态的成员函数都有一个this指针

C.this指针是存在对象里面的

D.this指针可以为空

答案:C

解析:

A:静态成员函数没有this指针,只有非静态成员函数才有,且为隐藏指针

B:非静态成员函数的第一个参数就是隐藏的this指针

C:this指针在非静态的成员函数里面,对象不存在,故错误

D:单纯的对this赋空是不可以的,不过可以强转直接赋空,不过一般不进行这样的操作

二、构造函数

知识回顾:

  1. 本质:类中特殊的成员函数,与类名同名,用于对象创建时自动初始化(分配资源、赋初始值等)。
  2. 核心目的:保证对象创建时处于有效状态,避免未初始化的 "脏数据"。
  3. 基本用法 :
    • 定义:class 类名 { 类名(参数列表) { 初始化逻辑 } };(如class Person { Person(int age) { this->age = age; } };);
    • 对象创建时自动调用(如Person p(20);,创建 p 时触发构造函数)。
  4. 规则 :
    • 无返回值(连void都不写),可重载(多个构造函数参数列表不同);
    • 若未显式定义,编译器会生成默认构造函数(无参、仅做浅初始化);
    • 带参数的构造函数会屏蔽默认构造函数,需手动定义无参构造(若需)。
      1、下列关于构造函数的描述正确的是()

A.构造函数可以声明返回类型

B.构造函数不可以用private修饰

C.构造函数必须与类名相同

D.构造函数不能带参数

答案:C

解析:

A:构造函数不能有返回值,包括void类型也不行

B:构造函数可以是私有的,只是这样之后就不能直接实例化对象

C:这是他的定义

D:构造函数不光可以带参数,还可以有多个构造函数构成重载

三、析构函数

知识回顾:

  1. 本质 :类中特殊的成员函数,与类名同名且前缀加~,用于对象销毁时自动清理资源(释放内存、关闭文件等)。
  2. 核心目的:避免资源泄漏,确保对象生命周期结束时,其占用的资源被正确回收。
  3. 基本用法 :
    • 定义:class 类名 { ~类名() { 清理逻辑 } };(如class Person { ~Person() { delete[] name; } };);
    • 对象销毁时(如离开作用域、delete 释放)自动调用,无需手动调用。
  4. 规则 :
    • 无返回值、无参数,不能重载(一个类仅有一个析构函数);
    • 若未显式定义,编译器会生成默认析构函数(仅做浅清理,不处理动态内存);
    • 涉及动态内存 / 资源时,必须显式定义析构函数(否则导致内存泄漏);
    • 析构函数调用顺序与构造函数相反(先创建的对象后销毁)。
      1、在函数F中,本地变量a和b的构造函数(constructor)和析构函数(destructor)的调用顺序是()

Class A;

Class B;

void F()

{

A a;

B b;

}

A.b构造 a构造 a析构 b析构

B.a构造 a析构 b构造 b析构

C.b构造 a构造 b析构 a析构

D.a构造 b构造 b析构 a析构

答案:D

解析:

A:构造顺序是按照语句的顺序进行构造,析构是按照构造的相反顺序进行析构,因此先构造b,故错误

B:a析构的时机不对,对象析构要在生存作用域结束的时候才进行析构,因此先析构a错误

C:b的构造时机错误,先构造a

D:正确,构造顺序是按照语句的顺序进行构造,析构是按照构造的相反顺序进行析构
2、设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为()

C c;

int main()

{

A a;

B b;

static D d;

return 0;

}

A.D B A C

B.B A D C

C.C D B A

D.A B D C

答案:B

解析:

1、类的析构函数调用一般按照构造函数调用的相反顺序进行调用,但是要注意static对象的存在, 因为static改变了对象的生存作用域,需要等待程序结束时才会析构释放对象

2、全局对象先于局部对象进行构造

3、局部对象按照出现的顺序进行构造,无论是否为static

4、所以构造的顺序为 c a b d

5、析构的顺序按照构造的相反顺序析构,只需注意static改变对象的生存作用域之后,会放在局部 对象之后进行析构

6、因此析构顺序为B A D C


相关推荐
怪我冷i9 分钟前
Rust 核心语法与内存安全机制
开发语言·安全·rust
鶴哥只手遮天11 分钟前
Spring AI Alibaba 深度技术系列-第 05 章 编译与执行引擎:CompiledGraph、GraphRunner与三段式 Executor
java·人工智能·开源
inrichtt14 分钟前
第十一课时:串口中断接收与回调函数实战解析
c语言·数据结构·stm32·单片机·嵌入式硬件
开开心心_Every27 分钟前
免费压缩软件WinRAR无弹窗、广告干扰
java·开发语言·前端·spring·智能手机·word·winrar
syagain_zsx29 分钟前
WebSocket 教程:websocketpp 写 echo 服务端
linux·网络·c++·websocket·网络协议·工具库
计算机毕设定制辅导-无忧学长30 分钟前
《基于微信小程序的个人智能刷题助手的设计与实现》
java·spring boot·mysql·微信小程序·uniapp·个人智能刷题助手系统
江沉晚呤时38 分钟前
零依赖的代价与自由:我用 C# 自研了一套 Office 读写库
开发语言·c#
大陈子编程42 分钟前
C++ CSP-J 与 CSP-S 题单:洛谷 140 题知识点全覆盖
c++
步行cgn44 分钟前
Spring MVC 中实现 request 域效果的几种方式
java·后端
Thomas.Sir1 小时前
第3课:SpringBoot4.x 自动配置原理:@EnableAutoConfiguration底层源码剖析
java·spring boot