C++核心

4.2对象的初始化

  • 生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全

  • C++中的面向对象来源于生活,每个对象也会有初始设置以及 对象销毁前的清理数据的设置

4.2.1构造函数和析构函数

对象的初始化和清理也是两个非常重要的安全问题

一个对象或者变量没有初始状态,对其使用后果是未知

同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题

C++利用了构造函数和析构函数解决了上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。

对象的初始化和清理工作是编译器强制要我们做的事情,因此我们不提供构造和析构,编译器会提供编译器提供的构造函数和析构函数是空实现。

  • 构造函数:主要作用在于创建对象是为对象的成员属性赋值,构造函数有编译器自动调用,无需手动调用。

  • 析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。

构造函数语法:类名(){}

1.构造函数,没有返回值 也不写void

2.函数名称与类名相同

3.构造函数可以有参数

4.程序在调用对象时候会自动调用构造,无须手动调用,而且只会调用一次

析构函数语法:~类名(){}

1.析构函数,没有返回值也不写void

2.函数名称与类名相同,在名称前加上符号~

3.析构函数不可以有参数,因此不可以发生重载

4.程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次


//对象的初始化和清理
//1.构造函数 进行初始化操作
//2.析构函数  进行清理操作class  Personn
{
public://1.1构造函数 进行初始化操作//没有返回值 不用写void//函数名与类名相同//构造函数可以有参数  可以重载//创建对象的时候 构造函数会自动调用 且只调用一次Personn(){cout << "Person构造函数的调用" << endl;}//2.析构函数 进行清理操作
//没有返回值 不写void
//函数名和类名相同 在名称前加~
//析构函数不可以有参数,不可以发生重载
//对象在销毁前 会自动调用析构函数,而且只会调用一次~Personn() {cout << "Person析构函数的调用" << endl;}
};//构造和析构都是必须有的实现,如果我们自己不提供,编译器会提供一个空实现的构造和析构
void test() {Personn p;//在栈上的数据,test01执行完毕后,释放这个对象
}int main() {//test();Personn p;system("pause");return 0;
}

4.2.2构造函数的分类及调用

两种分类方式:

按参数分类:有参构造和无参构造

按类型分类:普通构造和拷贝构造

三种调用方式:

括号法

显示法

隐式转换法


//1.构造函数的分类及调用
//分类
//按参数分类 有参无参
//按类型分类 普通拷贝
class Apple {
public://构造函数Apple() {cout << "Apple的构造函数调用" << endl;}Apple(int w) {weight = w;cout << "Apple有参构造函数调用" << endl;}//拷贝构造函数Apple(const Apple &a) {//将传入的人身上的所有属性拷贝到我身上weight = a.weight;cout << "Apple拷贝构造函数调用" << endl;}~Apple() {cout << "Apple的析构函数调用" << endl;}int weight;
};//调用
void test03() {//1.括号法//Apple p1;//默认构造函数调用//Apple p2(10);//有参构造函数//Apple p3(p2);//拷贝构造函数//注意事项//调用默认构造函数是,不要加()//因为下面这行代码,编译器会认为是一个函数声明,不会认为在创建对象//Apple a1();//cout << "p2的年龄为:" << p2.weight << endl;//cout << "p3的年龄为:" << p3.weight << endl;//2.显示法//Apple a1;//Apple a2 = Apple(10);//有参构造//Apple a3 = Apple(a2);//拷贝构造//Apple(10);//匿名对象 特点:当前行执行结束后,系统就会立即收掉匿名对象//cout << "aaaaa" << endl;//注意事项2//不要利用拷贝构造函数 初始化匿名对象 编译器会认为Apple(a3)===Apple a3;对象声明//Apple(a3);//3.隐式转换法Apple a4 = 10;//相当于写了Apple a4 = Apple(10); 有参构造Apple a5 = a4;//拷贝构造
}int main() {test03();system("pause");return 0;
}

4.2.3拷贝构造函数调用时机

C++中拷贝构造函数调用时机通常有三种情况

  • 使用一个已经创建完毕的对象来初始化一个新对象

  • 值传递的方式给函数参数传值

  • 以值方式返回局部对象

4.2.4构造函数调用规则

默认情况下,C++编译器至少给一个类添加3个函数

1、默认构造函数(无参,函数体为空)(空实现)

2、默认析构函数(无参,函数体为空)(空实现)

3、默认拷贝构造函数,对属性进行值拷贝(值拷贝)

构造函数调用规则如下:

  • 如果用户定义有参构造函数,C++不在提供默认无参构造,但是会提供默认拷贝构造

  • 如果用户定义拷贝构造函数,C++不会再提供其他构造函数

4.2.5深拷贝与浅拷贝

浅拷贝:简单的赋值拷贝操作

深拷贝:在堆区重新申请空间,进行拷贝操作

总结:如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题

4.2.6初始化列表

作用:

C++提供了初始化列表语法,用来初始化属性

语法:构造函数():属性1(值1),属性2(值2)...{}

//初始化列表
class Banana {
public://传统初始化操作/*Banana(int a, int b, int c) {m_A = a;m_B = b;m_C = c;}*///初始化列表初始化属性/*Banana() :m_A(10), m_B(20), m_C(30) {}*/Banana(int a, int b, int c) :m_A(a), m_B(b), m_C(c) {}int m_A;int m_B;int m_C;
};void test04() {//Banana p(10, 20, 30);Banana p(30,20,10);cout << "m_A=" << p.m_A << endl;cout << "m_B=" << p.m_B << endl;cout << "m_C=" << p.m_C << endl;
}int main() {test04();system("pause");return 0;
}

4.2.7类对象作为类成员

C++类中的成员可以是另一个类的对象,我们称该成员为对象成员

class A{}
class B{A a;
}

B类中有对象A作为成员,A为对象成员

构造的顺序:

当其他类对象作为本类成员,构造时候先构造类对象,在构造自身

先调用对象成员的构造,在调用本类构造

析构顺序与构造相反

4.2.8静态成员

静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员

静态成员分为:

  • 静态成员变量

    • 所有对象共享同一份数据

    • 在编译阶段分配内存

    • 类内声明,类外初始化

  • 静态成员函数

    • 所有对象共享同一个函数

    • 静态成员函数只能访问静态成员变量

4.3C++对象模型和this指针

4.3.1成员变量和成员函数分开存储

在C++中,类内的成员变量和成员函数分开存储

只有非静态成员变量才属于类的对象上

空对象占用内存空间为:1

C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置

每个空对象也应该有一个独一无二的内存地址

4.3.2this指针概念

C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象

this指针是隐含每一个非静态成员函数内的一种指针

this指针不需要定义,直接使用即可

this指针的本质 是指针常量 指针的指向是不可以修改的

this指针的用途:

  • 当形参和成员变量同名时,可用this指针来区分(1.解决名称冲突问题)

  • 在类的非静态成员函数中返回对象本身,可使用return this(2.返回对象本身用*this)

4.3.3空指针访问成员函数

C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针

如果用到this指针,需要加以判断保证代码的健壮性

4.3.4const修饰成员函数

常函数:

  • 成员函数后加const后我们称为这个函数为常函数

  • 常函数内不可以修改成员属性

  • 成员属性声明时加关键字mutable后,在常函数中依然可以修改

常对象:

  • 声明对象前加const称该对象为常对象

  • 常对象只能调用常函数

4.4友元

友元的目的就是让一个函数或者类访问另一个类中私有成员

友元的关键字为friend

友元的三种实现:

  • 全局函数做友元

  • 类做友元

  • 成员函数做友元


//建筑物类
class Building {//goodGay全局函数是Building好朋友,可以访问Building中私有成员friend void goodGay(Building* building);public:Building() {m_SittingRoom = "客厅";m_BedRoom = "卧室";}
public:string m_SittingRoom;//客厅
private:string m_BedRoom;//卧室
};//全局函数
void goodGay(Building* building) {cout << "好基友全局函数 正在访问:" << building->m_SittingRoom << endl;cout << "好基友全局函数 正在访问:" << building->m_BedRoom << endl;
}void test05() {Building building;goodGay(&building);
}int main() {test05();system("pause");return 0;
}

4.5运算符重载

运算符重载(operator overloading),就是对已有的运算符重新定义,赋予其另一种功能,以适应不同的数据类型。

3.3.1string容器

string是一个类,内部封装了char*,用来管理这个容器

string类中封装了很多的功能函数,如:find、copy、delete、replace、insert等

不用考虑内存释放和越界问题。

string管理char*所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心赋值越界取值越界等。

string构造函数

string();//创建一个空字符串 例如:string str;
string(const string& str);//使用一个string对象初始化另一个string对象
string(const char* s);//使用字符串s初始化
string(int n, char c);//使用n个字符c初始化

string基本赋值操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/659167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据恢复之道:DevicData-P-XXXXXXXX勒索病毒的预防与恢复攻略

尊敬的读者&#xff1a; 随着科技的发展&#xff0c;网络安全问题愈发突出&#xff0c;而勒索病毒作为其中的一种恶意软件&#xff0c;正不断演进成为威胁用户数据安全的严重问题。本文将深入介绍.DevicData-P-XXXXXXXX勒索病毒的特征&#xff0c;提供被感染文件的恢复方法&am…

os.environ函数用法

os.environ 是 Python 中 os 模块提供的一个字典&#xff0c;它表示当前系统的环境变量。环境变量是在操作系统级别设置的键值对&#xff0c;用于配置系统行为和提供信息给正在运行的进程。 os.environ 的基本用法包括获取和设置环境变量的值。下面是一些基本的使用示例&#…

jupyter python笔记杂乱

问题产生的原因: 无法执行sess.run()的原因是tensorflow版本不同导致的&#xff0c;tensorflow版本2.0无法兼容版本1.0 解决办法: tf.compat.v1.disable_eager_execution() 确保tf’2能运行tf1的代码 notebok打开指定文件夹 直接解决

落地PC ,AI的“iPhone时刻”要来了?

在AI技术浪潮持续翻涌的背景下&#xff0c;近段时间&#xff0c;不断有声音强调“2024年将是AIPC元年”。 为了奔赴这一可以预见的未来&#xff0c;产业链上下游的企业也“干劲十足”。品牌商方面&#xff0c;2024年的国际消费电子展&#xff08;CES&#xff09;上&#xff0c…

【ASP.NET Core 基础知识】--身份验证和授权--授权和策略

一、授权和策略的概念及应用 在ASP.NET Core中&#xff0c;授权和策略是重要的安全概念&#xff0c;用于确定用户是否有权限执行特定的操作或访问特定的资源。以下是关于ASP.NET Core中授权和策略的概念及其应用的一些重要信息&#xff1a; 1.1 授权&#xff08;Authorizatio…

Linux 文件IO

目录 linux下的文件分类&#xff1a; 文件描述符原理&#xff1a;&#xff08;底层原理&#xff0c;可跳过&#xff09; 虚拟文件系统&#xff1a; 内存中的inode与磁盘中的inode open函数 函数原型&#xff1a; 形参列表&#xff1a; 代码&#xff1a; close函数 er…

GBASE南大通用分享-Database 属性

GBASE南大通用分享 获得当前数据库的名字或在连接打开后使用的数据库名字。  语法 [Visual Basic] Public Overrides ReadOnly Property Database As String Get [C#] public override string Database { get; }  实现 IDbConnection.Database  注释 Database…

Vue_Router_守卫

路由守卫&#xff1a;路由进行权限控制。 分为&#xff1a;全局守卫&#xff0c;独享守卫&#xff0c;组件内守卫。 全局守卫 //创建并暴露 路由器 const routernew Vrouter({mode:"hash"//"hash路径出现#但是兼容性强&#xff0c;history没有#兼容性差"…

一分钟在SpringBoot项目中使用EMQ

先展示最终的结果: 生产者端: RestController RequiredArgsConstructor public class TestController {private final MqttProducer mqttProducer;GetMapping("/test")public String test() {User build User.builder().age(100).sex(1).address("世界潍坊渤…

springboot(ssm茶叶销售系统 在线茶叶商城管理系统 Java系统

springboot(ssm茶叶销售系统 在线茶叶商城管理系统 Java系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&…

protobuf 序列化协议之数据结构

. 一、数据结构 1、map /*** <pre>* map* ------------------------------------------------------------------------------------------* fieldNumber0Wiretype | entryMessage | fieldNumber0Wiretype | entryMessage* …

中国建设银行,这年终奖噶噶高!!!!(含算法原题)

国企年终 今天刷到一个近期帖子:「中国建设银行&#xff0c;这年终奖噶噶高!!!!」 先撇去具体内容不看&#xff0c;能在自然年的 月初&#xff0c;就把去年的奖金发了的企业&#xff0c;首先值得一个点赞。 再细看内容&#xff0c;年终奖是一个 字头的 位数。 由于国企通常没…

burp靶场--xss下篇【16-30】

burp靶场–xss下篇【16-30】 https://portswigger.net/web-security/all-labs#cross-site-scripting 实验16&#xff1a;允许使用一些 SVG 标记的反射型 XSS ### 实验要求&#xff1a; 该实验室有一个简单的反射型 XSS漏洞。该网站阻止了常见标签&#xff0c;但错过了一些 S…

Excel没有内置统计字数功能,但可以用一些变通的方法

是否需要计算Excel工作簿中某个单元格或单元格范围内的单词数? 出于多种原因,你可能需要计算文本数据中的字数。也许你有逗号分隔的列表,需要计算每个列表中的项目数。 不幸的是,Excel没有内置的单词计数方法。但是有一些聪明的方法可以得到你需要的结果。 这篇文章将向…

三步实现 Sentinel-Nacos 持久化

一、背景 版本&#xff1a;【Sentinel-1.8.6】 模式&#xff1a;【Push 模式】 参照官网介绍&#xff1a;生产环境下使用Sentinel &#xff0c;规则管理及推送模式有以下3种模式&#xff1a; 比较之后&#xff0c;目前微服务都使用了各种各样的配置中心&#xff0c;故采用Pus…

springboot综合案例(一)

文章目录 前言项目开发流程需求分析库表设计编码环节环境搭建mybatis的配置jsp模版引擎的配置日志的配置基本项目工程的配置 功能实现用户注册实现验证码功能实现用户注册 用户登录功能员工列表实现员工信息增删查改员工增加信息员工修改信息删除员工信息 前言 我具体用一个小…

苹果笔记本(MAC)常用快捷键

mac系统中常用的几个辅助键为fn、control(⌃)、option(⌥)、command(⌘)、shift(⇧) 基本快捷键 ⌘ Z 撤销 ⌘ X 剪切 ⌘ C 复制 ⌘ V 粘贴 ⌥ ⌘ ⇧ V 纯文本粘贴 ⌘ A 全选 ⌘ S 保存 ⌘ F 查找 ⌘ ⇧ 4 截图保存到桌面 ⌃ ⌘ ⇧ 4 截图到剪贴板 ⌘ ⇧ 5 截…

CUDA错误检查

CUDA错误检查 CUDA api执行结束回返回一个返回值&#xff0c;用于标记api的执行状态。 错误检查函数 获取错误代码的名称&#xff1a;cudaGetErrorName获取错误代码的描述信息&#xff1a;cudaGetErrorString 在调用cuda运行api时&#xff0c;调用ErrorCheck函数进行包装参…

【springboot图书个性化推荐系统】

前言 &#x1f31e;博主介绍&#xff1a;✌全网粉丝15W,CSDN特邀作者、211毕业、高级全栈开发程序员、大厂多年工作经验、码云/掘金/华为云/阿里云/InfoQ/StackOverflow/github等平台优质作者、专注于Java、小程序技术领域和毕业项目实战&#xff0c;以及程序定制化开发、全栈…

WindTerm 安装使用教程

一、WindTerm 功能介绍 WindTerm 是一款 Github 上开源的 SSH 终端工具&#xff0c;它是完全可以比肩 MobaXterm 工具的。其支持的系统及功能如下&#xff1a; 功能支持&#xff1a; SSHTelnetShellTCPSerialSFTPCmdPowerShellGit 二、WindTerm 官网下载 有两种获取方法&…