当前位置: 首页 > news >正文

c++构造与析构

构造函数特性

名称与类名相同:构造函数的名称必须与类名完全相同,并且不能有返回值类型(包括void)。
自动调用:构造函数在对象实例化时自动调用,不需要手动调用。
初始化成员变量:构造函数的主要作用是初始化对象的成员变量。
重载:一个类可以有多个构造函数,只要它们的参数列表不同(即构造函数可以被重载)。
无返回值:构造函数不能有返回值类型。
初始化列表:构造函数可以使用初始化列表来初始化成员变量,特别是当成员变量是常量或引用类型时

#include <iostream>
using namespace std;class Point {
public:// 默认构造函数Point() {x = 0;y = 0;cout << "Default constructor called" << endl;}// 带参数的构造函数Point(int xVal, int yVal) {x = xVal;y = yVal;cout << "Parameterized constructor called" << endl;}void print() {cout << "Point(" << x << ", " << y << ")" << endl;}private:int x, y;
};int main() {Point p1; // 调用默认构造函数Point p2(10, 20); // 调用带参数的构造函数p1.print();p2.print();return 0;
}

继承中的调用顺序:在继承中,基类的构造函数会在派生类的构造函数之前被调用

默认构造函数: 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成

无参(默认)构造函数
有参构造函数
委托构造函数
复制(拷贝)构造函数
移动构造函数

有参,无参,拷贝三种构造函数对应三种调用方式示例

#include<iostream>
using namespace std;
class Person
{
public://默认构造函数Person();Person(){cout << "调用无参(默认)构造函数" << endl;}Person(int a){age = a;cout << "调用有参构造函数" << endl;}//拷贝构造函数用于拷贝传入的类到自身类上 //除了拷贝构造函数外都是普通构造函数Person(const Person &p)//传入的类不希望被改变所以加const 传入引用用p指向该类{age = p.age;cout << "调用拷贝构造函数" << endl;}~Person(){cout << "析构函数的调用" << endl;}int age;};
void test()
{//调用//1.括号法//注意:调用无参构造时不要输入()//Person p();会被编译器认为是函数的声明Person p;//调用无参构造函数Person p1(10);//调用有参函数构造Person p2(p1);//调用拷贝构造函数cout <<"p1的年龄"<< p1.age << endl;cout <<"p2的年龄"<< p2.age << endl;//2.显式法Person p3;//调用无参构造函数Person p4=Person (10);//调用有参函数构造Person p5=Person (p1);//调用拷贝构造函数//Person(10)为匿名对象 等号左侧就是它的名 //特点:当前行结束时,系统会立即回收掉匿名对象 即它的析构函数会在该行结束后就调用而不是test函数结束//3.隐式转换法Person p6 = 10; //调用有参函数构造 相当于Person p6=Person(10);  假如有两个参数就是 Person p6 = (10,9);Person p7 = p1;//调用拷贝构造函数 相当于Person p7=Person(p1);
}
int main()
{test();system("pause");return 0;
}#include<iostream>
using namespace std;
class Person
{
public://默认构造函数Person();//有参构造Person(int age, int height);int m_Age;int* m_Height;
};
//默认构造
Person::Person() 
{cout << "默认构造函数的调用!" << endl;this->m_Age = 0;this->m_Height = new int(0);
}
//有参构造,把age赋值给m_Age,身高用m_Height指向
Person::Person(int age,int height)
{cout << "有参构造函数的调用!" << endl;this->m_Age = age;this->m_Height = new int(height);
}
int main()
{Person p(18,175);cout << "此人的年龄是: " << p.m_Age << endl;cout << "此人的身高是: " << *(p.m_Height) << endl;return 0;
}

委托构造函数

委托构造函数就是把自己构造的事情,交给其他的构造函数顺带完成

#include<iostream>
using namespace std;
class Person
{
public://默认构造函数Person();//有参构造Person(int age, int height);//拷贝构造Person(const Person& p);int m_Age;int* m_Height;
};
//默认构造
Person::Person() :Person(0, 0)
{cout << "委托构造函数的调用!" << endl;
}
//有参构造,把age赋值给m_Age,身高用m_Height指向
Person::Person(int age, int height)
{cout << "有参构造函数的调用!" << endl;this->m_Age = age;this->m_Height = new int(height);
}
//拷贝构造函数调用
Person::Person(const Person& p)
{cout << "拷贝构造函数的调用!" << endl;this->m_Age = p.m_Age;this->m_Height = new int(*p.m_Height);
}
int main()
{Person p;cout << "p的年龄是: " << p.m_Age << endl;cout << "p的身高是: " << *(p.m_Height) << endl;return 0;
}
#include<iostream>
using namespace std;
class Person
{
public://默认构造函数Person();//有参构造Person(int age, int height);//拷贝构造Person(const Person& p);int m_Age;int* m_Height;
};
//默认构造
Person::Person()
{cout << "默认构造函数的调用!" << endl;this->m_Age = 0;this->m_Height = new int(0);
}
//有参构造,把age赋值给m_Age,身高用m_Height指向
Person::Person(int age, int height)
{cout << "有参构造函数的调用!" << endl;this->m_Age = age;this->m_Height = new int(height);
}
//拷贝构造函数调用
Person::Person(const Person& p)
{cout << "拷贝构造函数的调用!" << endl;this->m_Age = p.m_Age;this->m_Height = new int(*p.m_Height);
}
int main()
{Person p1(18, 175);cout << "p1的年龄是: " << p1.m_Age << endl;cout << "p1的身高是: " << *(p1.m_Height) << endl;Person p2(p1);//将对象p1复制给p2。注意复制和赋值的概念不同 cout << "p2的年龄是: " << p2.m_Age << endl;cout << "p2的身高是: " << *(p2.m_Height) << endl;return 0;
}
#include<iostream>
#include<string>
using namespace std;
class Point {
public:Point(int a,int b,int c){this->a = a;this->b = b;this->c = c;cout << "这是Pointd的有3个默认参数的构造函数!  "<<this->a<<" "<<this->b<<" "<<this->c<<endl;}Point(int a, int b){this-> a= a;this->b = b;Point(3, 4, 5);//产生一个匿名对象,纸条语句执行结束,匿名对象会被析构。cout << "这是Pointd的有2个默认参数的构造函数!  " << this->a << " " << this->b << endl;}~Point(){cout << "Point对象被析构了! "<<this->a << " " << this->b << " " << this->c << endl;}int getC(){return c;}
private:int a;int b;int c;};int run()
{Point aa(1, 2);cout << aa.getC() << endl;  //c的值为垃圾值,因为匿名对象被创建有立即析构了  
//就算用不析构的方式,也是垃圾值,因为c是不同对象中的元素     //在2个参数的构造函数中,没有显式初始化c,不能通过构造其他对象而在本构造对象中访问未初始化的数据return 0;
}
int main()
{run();cout << "hello world!\n";return 0;
}

C++之构造函数的初始化参数表

初始化列表是成员变量定义的地方
不管有没有显示写初始化参数列表,编译器在调用构造函数时都会先走初始化参数列表
在C++11新特性中,允许在类中声明变量时给上缺省值,这里的缺省值实际上是给初始化参数列表使用的
初始化参数列表初始化的顺序与成员函数的声明顺序一致

class A{
public://在函数的括号后使用 : 成员变量(参数) 使用逗号进行分割//A(int a,int b):x(a),y(b){}A(int a,int b): x(a), y(b){}
private:int x;int y;
};
struct Test1
{Test1() // 无参构造函数{ cout << "Construct Test1" << endl ;}Test1(const Test1& t1) // 拷贝构造函数{cout << "Copy constructor for Test1" << endl ;this->a = t1.a ;}Test1& operator = (const Test1& t1) // 赋值运算符{cout << "assignment for Test1" << endl ;this->a = t1.a ;return *this;}int a ;
};struct Test2
{Test1 test1 ;Test2(Test1 &t1){test1 = t1 ;}
};

常用构造:
Test1() // 无参构造函数
A(int a,int b):x(a),y(b){}//构造函数初始化参数表
Test1(const Test1& t1) // 拷贝构造函数
Test1& operator = (const Test1& t1) // 赋值运算符

初始化列表实例

class Stack {
public:Stack(int capacity = 10): _a((int*)malloc(sizeof(int))), _top(0), _capacity(capacity){if (nullptr == _a){perror("fail malloc");exit(-1);}memset(_a, 0, sizeof(int) * capacity);}
private:int* _a;int _top;int _capacity;
};
class A {
public:A():_x(1),_a1(3),_a2(1),_z(_a1){_a1++;_a2--;}
private:int _a1 = 1;	//声明int _a2 = 2;const int _x;int& _z;B _bb;
};

析构函数

清理资源:析构函数通常用于释放对象在其生命周期内分配的资源,例如动态分配的内存、打开的文件句柄等

#include <iostream>
using namespace std;class Example {
public:// 构造函数Example() {cout << "Constructor called" << endl;data = new int[10]; // 动态分配内存}// 析构函数~Example() {cout << "Destructor called" << endl;delete[] data; // 释放动态分配的内存}private:int* data;
};int main() {Example ex; // 创建对象,调用构造函数// 对象生命周期结束时,自动调用析构函数return 0;
}#include <iostream>
using namespace std;
//构造函数的实现
class Student
{
public:     //:flag(Flag)解释:类内变量(参数)Student(int Flag,char Sex, string Name, const char *File); //类外参数列表函数声明//类内使用方式,不需要声明// Student(int Flag,char Sex, string Name) :flag(Flag),sex(Sex),name(Name) //构造函数// {//   // //错误形式://   // int a=10;//   // int &b;//   // b=a; //大错特错//   cout<<"类内:flag="<<this->flag<<endl;//   cout<<"类内:sex="<<this->sex<<endl;//   cout<<"类内:name="<<this->name<<endl;// }private:int &flag;  //必须用参数列表方式char sex;string name;const char *file = NULL;  //必须使用参数列表方式//引用变量定义法则->构造函数名(参数):引用变量名(参数)};//类外构造函数
Student::Student(int Flag,char Sex, string Name,const char *File):flag(Flag),sex(Sex),name(Name),file(File) //构造函数{// //错误形式:// this->flag=Flag;相当于以下:// int a=10;// int &b;// b=a; //大错特错cout<<"类内:flag="<<this->flag<<endl;cout<<"类内:sex="<<this->sex<<endl;cout<<"类内:name="<<this->name<<endl;cout<<"类内:file="<<this->file<<endl;}
int main(int argc, char const *argv[])
{Student st(100,'M',"JKJK","/usr/include/linux/fb.h");  //先创建了对象,后执行构造函数return 0;
}struct foo
{int i ;int j ;foo(int x):i(x), j(i){}; // ok, 先初始化i,后初始化j
};

浅拷贝

int* shallowCopy(int* original) {return original; // 只是复制了指针,没有复制指针指向的内存
}

浅拷贝只是复制了对象的引用或指针,而不是复制对象所指向的资源

深拷贝

int* deepCopy(int* original, size_t size) {int* copy = new int[size];std::copy(original, original + size, copy);return copy; // 复制了指针指向的内存
}
class MyArray {
public:MyArray(size_t size) : size_(size), data_(new int[size]) {}~MyArray() { delete[] data_; }// 禁用拷贝构造函数和赋值操作符以防止浅拷贝MyArray(const MyArray&) = delete;MyArray& operator=(const MyArray&) = delete;// 实现深拷贝的拷贝构造函数MyArray(const MyArray& other) : size_(other.size_), data_(new int[other.size_]) {std::copy(other.data_, other.data_ + size_, data_);}// 实现深拷贝的赋值操作符MyArray& operator=(MyArray other) {std::swap(size_, other.size_);std::swap(data_, other.data_);return *this;}
​
private:size_t size_;int* data_;
};

有时间继续

相关文章:

c++构造与析构

构造函数特性 名称与类名相同&#xff1a;构造函数的名称必须与类名完全相同&#xff0c;并且不能有返回值类型&#xff08;包括void&#xff09;。 自动调用&#xff1a;构造函数在对象实例化时自动调用&#xff0c;不需要手动调用。 初始化成员变量&#xff1a;构造函数的主…...

C++(函数重载,引用,nullptr)

1.函数重载 C⽀持在同⼀作⽤域中出现同名函数&#xff0c;但是要求这些同名函数的形参不同&#xff0c;可以是参数个数不同或者类型不同。传参时会自动匹配传入的参数&#xff0c;对应该函数的形参类型&#xff0c;进行函数调用&#xff0c;这样C函数调⽤就表现出了多态⾏为&a…...

django+postgresql

PostgreSQL概述 PostgreSQL 是一个功能强大的开源关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;以其高度的稳定性、扩展性和社区支持而闻名。PostgreSQL 支持 SQL 标准并具有很多先进特性&#xff0c;如 ACID 合规、复杂查询、外键支持、事务处理、表分区、JS…...

前端滚动锚点(点击后页面滚动到指定位置)

三个常用方案&#xff1a;1.scrollintoView 把调用该方法的元素滚动到屏幕的指定位置&#xff0c;中间&#xff0c;底部&#xff0c;或者顶部 优点&#xff1a;方便&#xff0c;只需要获取元素然后调用 缺点&#xff1a;不好精确控制&#xff0c;只能让元素指定滚动到中间&…...

使用SSL加密465端口发送邮件

基于安全考虑&#xff0c;云虚拟主机的25端口默认封闭&#xff0c;如果您有发送邮件的需求&#xff0c;建议使用SSL加密端口&#xff08;465端口&#xff09;来对外发送邮件。本文通过提供.NET、PHP和ASP样例来介绍使用SSL加密端口发送邮件的方法&#xff0c;其他语言的实现思路…...

一些面试题总结(一)

1、string为什么是不可变的&#xff0c;有什么好处 原因&#xff1a; 1、因为String类下的value数组是用final修饰的&#xff0c;final保证了value一旦被初始化&#xff0c;就不可改变其引用。 2、此外&#xff0c;value数组的访问权限为 private&#xff0c;同时没有提供方…...

泄露的文档显示 Google 似乎意识到了 Tensor 处理器存在过热问题

Google 知道其 Tensor 芯片存在一些问题&#xff0c;尤其是在过热和电池寿命方面&#xff0c;显然他们正在努力通过即将推出的代号为"Malibu"的 Tensor G6 来解决这一问题。 Android Authority 泄露的幻灯片显示&#xff0c;过热是基于 Tensor 的 Pixel 手机退换货的…...

python爬虫案例——网页源码被加密,解密方法全过程

文章目录 1、任务目标2、网页分析3、代码编写1、任务目标 目标网站:https://jzsc.mohurd.gov.cn/data/company,该网站的网页源码被加密了,用于本文测验 要求:解密该网站的网页源码,请求网站并返回解密后的明文数据,网页内容如下: 2、网页分析 进入网站,打开开发者模式,…...

2.4_SSRF服务端请求伪造

SSRF服务端请求伪造 定义&#xff1a;服务端请求伪造。是一种攻击者构造请求后&#xff0c;交由服务端发起请求的漏洞&#xff1b; 产生原理&#xff1a;该服务器提供了从其他服务器获取数据的功能&#xff0c;但没有对用户提交的数据做严格校验&#xff1b; 利用条件&#…...

数据分析反馈:提升决策质量的关键指南

内容概要 在当今快节奏的商业环境中&#xff0c;数据分析与反馈已成为提升决策质量的重要工具。数据分析不仅能为企业提供全面的市场洞察&#xff0c;还能帮助管理层深入了解客户需求与行为模式。掌握数据收集的有效策略和工具&#xff0c;企业能够确保获得准确且相关的信息&a…...

一步步安装deeponet的详细教学

1.deepoent官网如下&#xff1a; https://github.com/lululxvi/deeponet 需要下载依赖 1.python3 2.DeepXDE&#xff08;这里安装DeepXDE<0.11.2,这个最方便&#xff09; Optional: For CNN, install Matlab and TensorFlow 1; for Seq2Seq, install PyTorch&#xff0…...

Devops业务价值流:版本发布最佳实践

敏捷开发中&#xff0c;版本由多个迭代构建而成&#xff0c;每个迭代都是产品进步的一环。当版本最后一个迭代完成时&#xff0c;便启动了至关重要的上线流程。版本发布流程与规划流程相辅相成&#xff0c;确保每个迭代在版本中有效循环执行&#xff0c;最终达成产品目标。 本…...

背包问题(三)

文章目录 一、二维费用的背包问题二、潜水员三、机器分配四、开心的金明五、有依赖的背包问题 一、二维费用的背包问题 题目链接 #include<iostream> #include<algorithm> using namespace std; const int M 110; int n,m,kg; int f[M][M];int main() {cin >…...

linux之调度管理(2)-调度器 如何触发运行

一、调度器是如何在程序稳定运行的情况下进行进程调度的 1.1 系统定时器 因为我们主要讲解的是调度器&#xff0c;而会涉及到一些系统定时器的知识&#xff0c;这里我们简单讲解一下内核中定时器是如何组织&#xff0c;又是如何通过通过定时器实现了调度器的间隔调度。首先我们…...

深入理解 Vue 3 中的 Props

深入理解 Vue 3 中的 Props Vue 3 引入了 Composition API 等新特性&#xff0c;组件的定义和使用也变得更为灵活。而在组件通信中&#xff0c;Props&#xff08;属性&#xff09;扮演了重要角色&#xff0c;帮助父组件向子组件传递数据&#xff0c;形成单向的数据流动&#x…...

校园周边美食探索及分享平台

摘要&#xff1a; 美食一直是与人们日常生活息息相关的产业。传统的电话订餐或者到店消费已经不能适应市场发展的需求。随着网络的迅速崛起&#xff0c;互联网日益成为提供信息的最佳俱渠道和逐步走向传统的流通领域&#xff0c;传统的美食业进而也面临着巨大的挑战&#xff0…...

内网对抗-信息收集篇SPN扫描DC定位角色区域定性服务探针安全防护凭据获取

知识点&#xff1a; 1、信息收集篇-网络架构-出网&角色&服务&成员 2、信息收集篇-安全防护-杀毒&防火墙&流量监控 3、信息收集篇-密码凭据-系统&工具&网站&网络域渗透的信息收集&#xff1a; 在攻防演练中&#xff0c;当完成边界突破后进入内…...

石墨舟氮气柜:半导体制造中的关键保护设备

石墨舟是由高纯度石墨材料制成的&#xff0c;主要用于承载硅片或其他基板材料通过高温处理过程&#xff0c;是制造半导体器件和太阳能电池片的关键设备之一。 石墨舟在空气中容易与氧气发生反应&#xff0c;尤其是在高温处理后&#xff0c;表面可能更为敏感&#xff1b;石墨舟具…...

性能调优专题(7)之Innodb底层原理与Mysql日志机制深入剖析

一、MYSQL的内部组件结构 大体来说,Mysql可以分为Server层和存储引擎层两部分。 1.1 Server层 Server层主要包括连接器、查询缓存、词法分析器、优化器等。涵盖MYSQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功…...

量子计算及其在密码学中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 量子计算及其在密码学中的应用 量子计算及其在密码学中的应用 量子计算及其在密码学中的应用 引言 量子计算概述 定义与原理 发展…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

Pandas 可视化集成:数据科学家的高效绘图指南

为什么选择 Pandas 进行数据可视化&#xff1f; 在数据科学和分析领域&#xff0c;可视化是理解数据、发现模式和传达见解的关键步骤。Python 生态系统提供了多种可视化工具&#xff0c;如 Matplotlib、Seaborn、Plotly 等&#xff0c;但 Pandas 内置的可视化功能因其与数据结…...

新版NANO下载烧录过程

一、序言 搭建 Jetson 系列产品烧录系统的环境需要在电脑主机上安装 Ubuntu 系统。此处使用 18.04 LTS。 二、环境搭建 1、安装库 $ sudo apt-get install qemu-user-static$ sudo apt-get install python 搭建环境的过程需要这个应用库来将某些 NVIDIA 软件组件安装到 Je…...