C++ 复习 -- 构造和析构

基于R语言 meta/metafor 包进行荟萃分析(一) 在此部分中,使用连续结果详细描述了通用逆方差方法及其在meta分析中的应用,还介绍了固定效应法和随机效应法。我们已经展示了如何分别将典型数据与metacont和metagen函数一起使用,以及如何print和绘制森林图。我们还讨论了估计研究间方差的各种方法,并将Hartung-Knapp平差描述为经典随机效应方法的替代方法。此外,我们还说明了byvar选项的使用,这使得亚组分析更加简单。关于亚组分析的更多细节见后续章节。 阅读详情


 什么是构造函数

类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。


构造的是什么呢?
构造成员变量的初始化值,内存空间等
构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。



构造函数实例


无参构造:


#include <iostream>
#include <string>
using namespace std; // 使用std命名空间
class Car {
public:
string brand; // 不需要使用std::string
int year;
// 无参构造函数
Car() {
brand = "未知";
year = 0;
cout << "无参构造函数被调用" << endl; // 不需要使用std::cout和std::endl
}

void display() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
int main() {
Car myCar; // 创建Car对象
myCar.display(); // 显示车辆信息
return 0;
}


================================


有参构造


#include <iostream>
#include <string>
using namespace std;
class Car {
public:
string brand;
int year;
// 带参数的构造函数,使用常规的赋值方式
Car(string b, int y) {
brand = b;
year = y;
}

void display() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};


int main() {
Car myCar("Toyota", 2020); // 使用带参数的构造函数创建Car对象
myCar.display(); // 显示车辆信息
return 0;
}


===============================


参数列表:


在C++中,使用初始化列表来初始化类的字段是一种高效的初始化方式,尤其在构造函数中。

初始化列表直接在对象的构造过程中初始化成员变量,而不是先创建成员变量后再赋值。这对于提高性能尤其重要,特别是在涉及到复杂对象或引用和常量成员的情况下。
初始化列表紧跟在构造函数参数列表后面,以冒号( : )开始,后跟一个或多个初始化表达式,每个表达式通常用逗号分隔。下面是使用初始化列表初始化字段的例子:


class MyClass {
private:
int a;
double b;
std::string c;
public:
// 使用初始化列表来初始化字段
MyClass(int x, double y, const std::string& z) : a(x), b(y), c(z) {
// 构造函数体
}

};

在这个例子中, MyClass 有三个成员变量: a ( int 类型)、 b ( double 类型)和 c
( std::string 类型)。当创建 MyClass 的一个实例时,我们通过构造函数传递三个参数,这些参数被用于通过初始化列表直接初始化成员变量。初始化列表 : a(x), b(y), c(z) 的意思是用 x 初始化
a ,用 y 初始化 b ,用 z 初始化 c 。


初始化列表的优点:


1. 效率:对于非基本类型的对象,使用初始化列表比在构造函数体内赋值更高效,因为它避免了先默认构造然后再赋值的额外开销。


2. 必要性:对于引用类型和常量类型的成员变量,必须使用初始化列表,因为这些类型的成员变量在构造函数体内不能被赋值。


3. 顺序:成员变量的初始化顺序是按照它们在类中声明的顺序,而不是初始化列表中的顺序。
使用初始化列表是C++中推荐的初始化类成员变量的方式,因为它提供了更好的性能和灵活性。


case:

#include <iostream>
#include <string>
using namespace std; // 使用std命名空间
class Car {
public:
string brand; // 不需要使用std::string
int year;
//参数列表来构造:
Car(string mybrand,int myyear):brand(mybrand),year (myyear){}

void display() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
int main() {
Car myCar("mxj",1999); // 创建Car对象
myCar.display(); // 显示车辆信息
return 0;
}

===========================================================


析构函数:

概念


析构函数是C++中的一个特殊的成员函数,它在对象生命周期结束时被自动调用,用于执行对象销毁前的清理工作。析构函数特别重要,尤其是在涉及动态分配的资源(如内存、文件句柄、网络连接等)的情况下。

基本特性


1. 名称:析构函数的名称由波浪号( ~ )后跟类名构成,如 ~MyClass() 。
2. 无返回值和参数:析构函数不接受任何参数,也不返回任何值。
3. 自动调用:当对象的生命周期结束时(例如,一个局部对象的作用域结束,或者使用 delete 删除一个动态分配的对象),析构函数会被自动调用。
4. 不可重载:每个类只能有一个析构函数。
5. 继承和多态:如果一个类是多态基类,其析构函数应该是虚的。

case:


#include <iostream>
using namespace std;
class MyClass{
private:
int* datas;
public:
MyClass(int size){
datas = new int[size];
}
~MyClass(){
cout << "析构函数被调用" << endl;
delete[] datas;
}

};
int main()
{
MyClass m1(5);
MyClass *m2 = new MyClass(10);
delete m2; // 使用 delete 删除一个动态分配的对象,析构函数会被自动调用

return 0;// 函数退出--对象的生命周期结束
}

重要性
析构函数在管理资源方面非常重要。没有正确实现析构函数,可能导致资源泄露或其他问题。在基于RAII
(资源获取即初始化)原则的C++编程实践中,确保资源在对象析构时被适当释放是非常关键的。当使用
智能指针和其他自动资源管理技术时,可以减少显式编写析构函数的需要,但了解析构函数的工作原理
仍然很重要。


 

汽车OTA 测试用例 阅读详情

相关推荐

sdio wifi 移植

介绍 简单来说,sdio起源自sd标准,顾名思义就是sd的IO接口(interface)的意思,更具体的说明,sd本来是记忆卡的标准,但是现在也可以把SD卡拿来插上一些外围设备接口使用,这个就是就叫做sdio。 而且sdio本身是一种相当单纯的技术,通过sd的IO引脚来连接外部外围,并且通过sd的IO数据接位与外围传输数据,而且sd协会也推出很完整的sdio stack 驱动程序,使得sdio外围得开发与应用变得非常热门 这里我们要移植的是RTL8822cs的sdio WiFi 模块,将其移植到rk3

Enosji的博客 9610

C++知识点复习 ---- 对象的构造顺序和对象的析构

一.对象的构造顺序 (1)局部对象的构造顺序依赖于程序的执行流 (2)堆对象的构造顺序依赖于 new 的使用顺序 (3)全局对象的构造顺序是不确定的 二.析构函数 析构函数: C++的类中可以定义一个特殊的清理函数,这个特殊的清理函数叫做析构函数 析构函数的功能与构造函数相反 定义:~className() 析构函数的定义准则: 当类中自定义了构造函数,并且构造函数中使用了系统资源,如内存申请,文件打开等,则需要自定义析构函数 总结: 析构函数没有参数也没有返回值类型声明 析构函数在对象销毁时自动被调用 析

Foxproll的专栏 643

Allegro模块复用:从原理图到PCB的完整流程与关键细节

本文详细介绍了Allegro模块复用从原理图到PCB的完整流程与关键细节,包括DSN和MDD文件的创建、模块调用的实战技巧以及双向同步与版本控制方法。通过标准化处理和高级复用技巧,能显著提升PCB设计效率,减少重复工作时间。适用于智能硬件和工业控制等领域的工程师。

weixin_30252709的博客 332

C++基础复习(为开发做准备2)-析构和构造函数+继承和派生

析构和构造函数 C++构造函数详解 在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是构造函数(Constructor)。 我们通过成员函数 setname()、setage()、setscore() 分别为成员变量 name、age、score 赋值,这样做虽然有效,但显得有点麻烦。有了构造函数...

weixin_42989738的博客 364

Keil调试技巧:3种方法查看Cortex-M4的SCB寄存器(含CPUID内存映射解析)

本文详细介绍了在Keil MDK中查看Cortex-M4内核SCB寄存器的三种实战方法:使用Watch窗口进行符号化观察、通过Memory窗口直接查看物理内存映射,以及利用SFR寄存器浏览器解析位域信息。文章重点解析了CPUID寄存器的内存映射地址(0xE000ED00)及其位域含义,帮助开发者深入理解处理器身份识别与底层调试技巧,提升嵌入式系统调试效率。

h6i7j8的博客 569

PSO算法介绍

结合网上的文章对PSO进行一些介绍,并附上自己复现的算法。

Witty_Hou的博客 1万+

关于析构、函数调用堆栈、返回临时变量造成的疑惑

其实这也在我们预料中,返回的是temp,先前没对temp做修改,改的是*this,这个时候改的*this其实才是先前 return 的 temp。ok我们可以看到temp在还没拷贝的时候随机被分配一个数据成员的值,this就是我们外面的b,a的值是200,正常。问题来了,终端没有析构信息出现,this的地址变成了0x5ffe4c,并且值是200,正好是之前的temp。按照我们常规思考,应该是正常析构,比如200,201,202,203,204……++a,*this的a变成了201,正常。

qq_74352655的博客 293

数据库迁移策略实战:MySQL到PostgreSQL

数据库迁移是一项复杂且细致的任务,需要充分的准备工作、合适的迁移策略和严格的验证与优化步骤。通过选择合适的迁移工具、进行手动迁移和应用程序适配、以及迁移后的验证与优化,可以确保数据迁移的成功和业务的连续性。希望本文的分享能够为大家在MySQL到PostgreSQL的数据库迁移实战中提供一些有用的参考和启示。

shejizuopin的博客 1732

深度探索C++对象模型复习和学习 第五章:构造、析构、拷贝、语意学

待续

学峰的学习笔记 438

CentOS7 内核升级

可在http://ftp.sjtu.edu.cn/sites/elrepo.org/linux/kernel/el7/x86_64/RPMS选择对应架构平台不受影响的内核版本文件下载,然后离线安装,也可通过yum下载包后进行安装。通过 #uname -sr ,可以看到当前的内核版本 Linux 3.10.0-1160.el7.x86_64。首先找台能访问互联网的机器,通过联网的机器进行内核包下载。lt:longterm的缩写:长期维护版;ml:mainline的缩写:最新稳定版;

Jian Sun_的博客 601

Xilinx/AMD公司7系列FPGA的ISERDESE2仿真的”天坑”(附verilog的源码vivado仿真工程)

研究LVDS输出接口的ADC与7系列(ZYNQ)FPGA对接过程中,在Vivado中搭建了ISERDESE2的仿真工程,仿真结果ISERDESE2的并行输出口一直输出X或Z,这个坑之大,耗费了我数天的时间,可以称为“天坑”了。同步复位的要求肯定是高于异步复位的,古话说得好“两害相权取其轻”,所以,跟古话对着干就对了!就当RST是同步复位吧,最后经过反复验证,发现。开始怀疑复位信号是否高电平持续时间不够长?但是没有查到复位时间的要求 : - (

FPGA艺术家的博客 171

C++ 类和对象复习(上)

注意以上5个运算符不能重载*

2503_90450246的博客 1006

如何修改网页中的文本内容改成自己希望的数值?

本篇文章主要讲解,通过浏览器命令和浏览器自带的F12开发者工具,进行修改网页内容的方法教程 日期:2021年12月5日 作者:任聪聪 一、通过F12开发者工具进行修改 进入方式汇总: 1.右击鼠标,显示菜单找到审查 2.通过快捷键F12进入,笔记本需要先关闭fnlk功能键。 开发者工具介绍 说明: 1.表示选择元素,点击后可以选择文本的元素所在地 2.表示显示方式,手机还是电脑 3.表示div元素,点击后可以展开,对div内的html和文本进行编辑。 双击文本,即可进行修改成自己想要的,但是刷新后.

任聪聪的博客 2万+

C++中的对象的创建与析构

在第一次的代码中, 也就是都是值的那个版本,我在return a的时候实际上是调用了一次复制构造函数,产生了一个新对象,而赋值给b就相当于把这个新对象命名为b,但是我在返回引用的时候,我返回的是之前存在的对象,而b这个显然是一个新对象,所以此时就是调用复制构造函数对b进行初始化,所以才会有Aconst的输出,那么我把b不接受那么应该也不会有复制构造函数。上面是传值的时候进行构造,在c++中也有引用传参,但是根据引用的定义,引用是原来物体的别名,所以在进行传参时不会进行构造。如果有错希望提出正确的答案。

cjr1221的博客 233

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++ 类和对象(中)

/空类什么都没有吗?class A{};当我们没有显式定义的时候,类里面包含了六个默认成员函数,其中我们需要重点掌握前4个构造函数是特殊的成员函数,是用来初始化对象的①构造函数函数名与类名相同;②构造函数没有返回值;③对象实例化的时候自动调用;④构造函数可以重载class Apublic:A(int a,int b)//显式定义的构造函数,对对象的成员变量初始化工作_a = a;_b = b;int _b;int main()

2401_83238095的博客 968

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

c++复习(4)类和对象(上中下)

h里面声明,.cpp里面定义.h中定义.cpp中使用要:: 为了区分全局变量,还是类域里面的相当于告诉编译器在Stack里面找类的变量搜索会上下都找成员函数如果在类中定义,会当做内联函数不会进入符号表,直接展开)加_为了区分类中的成员变量(声明是一种承诺,定义是之前的承诺的实现)后来c++11支持了声明给缺省值内置类型不处理总结:一般情况下需要我们自己写构造函数,决定初始化方方式,成员变量全是自定义类型,可以考虑不写构造函数Data这种不需要我们实现拷贝构造,默认生成的就可以用。

Areszyz的博客 959

C++复习笔记

C++ 复习思维导图 云笔记传送门 文章目录引言万物皆对象封装分治————访问控制三无并发的解决思路构造,析构,拷贝引用 reference(安全的指针)克隆构造 copy constructorstatic运算符重载:继承代码重用 reuse多继承多态多态性纯虚函数(仅适用于抽象类:不能创建实例)Interfacetemplate——reuseIterator——所有STL类的内部类Fac...

weixin_43387647的博客 312

C++类和对象(一)(复习)

用类将对象的属性和方法结合在一块,通过访问权限,选择性的将其接口提供给外部。第一个成员在与结构体变量偏移量为0的地址处。(即结构体的首地址处,即对齐到0处)其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。结构体的总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。对齐数 = 该结构体成员变量自身的大小与编译器默认的一个对齐数的较小值。

qq_73955920的博客 355

C++复习笔记-面向对象

C++中的类和对象的使用和相关特性

weixin_47533318的博客 1284

【C++体系】C/C++要点复习

为了准备秋招及春招,现阶段的任务是将所学过的知识进行复习,并串联起来。首当其冲的就是编程语言的复习,C++自己平时写的也比较多,但仍有很多语法细节不太记得了,这里浅记一些平常容易忽略的要点。........................

codeslogan 583

C++_期中复习总结

静态与友元 的使用 小知识点 用于定义最大最小值 用于输出指定精度 用于设置指定字符 用于求最大最小值 使用函数获取字符串的长度 使用进行字符串的复制 创建动态二维数组 法1 法2 题目 定义一个Account类型的指针数组,让每个指针指向动态分配的Account对象

2301_79837864的博客 427

【GPA】C++面向对象程序设计_笔试详解

C++期末笔试的完全解析。

Explorer Dong 的技术博客 1668

也谈析构:析构函数何时被调用

为什么要说“也”?用google搜索“析构函数”是,google会说“约有81,500项符合 析构函数 的查询结果”,我最近复习c++是有所心得,所以“也”想谈谈“析构函数”。我不想像教科书似的介绍它,而是从它何时被调用来浅谈一下。 析构函数在下边3种情况时被调用: 1.对象生命周期结束,被销毁时; 2.delete指向对象的指针时,或delete指向对象的基类类型指针,而其基类虚构函数是虚函...

测试0901-1 405

期末复习笔记(大一下)

大一下期末复习一些总结。 主要内容关于类继承,多态,文件处理,异常处理和类模板。

han_lx_的博客 621

C/C++复习(三)

重载取址运算符函数/默认重载取址运算符const函数。无参的构造函数和全缺省的构造函数。

2301_79813267的博客 899

重庆大学程序设计C++复习总结

2023重庆大学程序设计C++复习总结

CQU_Freshman的博客 2461

c++ 类和对象 —— 中 【复习笔记】

构造函数虽然叫构造,但它的作用不是开空间创建对象而是初始化对象它具有以下特性:1. 函数名和类名相同2. 无返回值3. 构造函数可以重载4. 对象实例化时编译器自动调用5. 如果类没有显式定义构造函数,那编译器会自动生成一个无参的默认构造函数;如果类显式定义了,那编译器不再生成内置类型成员在类中声明时可以给默认值。

2402_87252674的博客 732
上一篇: C++ 复习 -- 重载
下一篇: C++复习 -- 引用 &
mx_jun
博客等级 码龄5年 1605粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值