C++细节

news2024/9/23 1:30:44

背景知识:
面向对象的编程中,类(Class)是创建对象的蓝图或模板,它包含了数据(通常称为属性或变量)和行为(通常称为方法或函数)。将数据封装为私有(private)成员,并通过公共(public)成员函数来访问和修改这些数据,是实现封装性的重要方式,也是面向对象编程的三大基本特性之一(封装、继承、多态)。

构造函数(Constructor):
当创建类的新对象时,构造函数会被自动调用。
它用于初始化对象的属性或状态。
构造函数的名字必须与类名相同,且不能有返回类型(即使是void)。
它可以有参数,用于在创建对象时提供初始值。

class MyClass {  
private:  
    int myVar;  
public:  
    MyClass(int value) : myVar(value) {} // 构造函数  
};

拷贝构造函数(Copy Constructor):
当用一个已存在的对象去初始化一个同类型的新对象时,拷贝构造函数会被调用。
它通常用于创建原对象的一个副本。
拷贝构造函数的形式是 ClassName(const ClassName &other)

class MyClass {  
private:  
    int myVar;  
public:  
    MyClass(int value) : myVar(value) {} // 构造函数  
    MyClass(const MyClass &other) : myVar(other.myVar) {} // 拷贝构造函数  
};

成员函数(Member Function):
成员函数是定义在类内部,用来操作对象数据的函数。
它们可以访问类的私有和受保护成员。
通过成员函数,可以定义对象的行为和对象间的运算关系。

class MyClass {  
private:  
    int myVar;  
public:  
    MyClass(int value) : myVar(value) {} // 构造函数  
    void setVar(int value) { myVar = value; } // 成员函数  
    int getVar() const { return myVar; } // 成员函数  
};

析构函数(Destructor):
析构函数在对象生命周期结束时自动调用,用于释放对象所占用的资源。
析构函数的名字与类名相同,但在前面加上一个波浪号(~)。
析构函数没有返回类型,也没有参数。

class MyClass {  
private:  
    int* myPtr;  
public:  
    MyClass(int value) : myPtr(new int(value)) {} // 构造函数  
    ~MyClass() { delete myPtr; } // 析构函数  
};

成员函数作用
成员函数的作用:

  1. 对象数据的存储和访问

成员函数可以访问并维护对象的数据成员。它们可以由类或实例直接调用,以执行任何操作并访问想要的数据。例如,对象A可以调用成员函数B并访问自身的数据成员,以将修改保存到它的数据存储中。

  1. 对象定义的操作

成员函数使对象可以执行某些操作。例如,对于一个图形类,成员函数可以是计算它的面积或周长的方法,或将其移动到一个新的坐标上的方法。
访问和修改私有数据:通过将数据成员声明为私有(private),可以确保它们只能通过类的成员函数来访问和修改。这有助于维护数据的完整性和安全性,防止数据被不当访问或修改。

实现对象的行为:成员函数定义了对象的行为。它们可以执行各种操作,如计算、数据转换、输入/输出等。通过调用这些成员函数,可以使对象执行特定的任务或响应外部事件。

提供接口:成员函数为类的使用者提供了一个接口,使得他们可以与对象进行交互。通过调用这些函数,用户可以发送消息给对象,请求其执行某些操作或返回某些信息。

实现多态性:通过虚成员函数(virtual member functions),可以实现多态性,即允许基类的指针或引用指向派生类的对象,并调用派生类实现的函数版本。这使得代码更加灵活和可扩展。

封装复杂性:成员函数可以将复杂的逻辑封装在类内部,使得类的使用者无需关心内部实现细节,只需通过调用成员函数来与对象交互。这有助于简化代码的使用和维护。

**我的话:**类当中有函数,有变量,一般将变量封装为private,函数作为public对外的接口。其中,函数又分为构造函数,拷贝构造函数,成员函数,析构函数,一般构造函数用来初始化对象的变量,析构函数用来释放的,拷贝构造函数用来拷贝一份对象中的属性,成员函数用来描述变量间的运算逻辑关系。

1、默认调用与手动调用

创建对象时,编译器自动调用构造、拷贝构造和析构,而成员函数或成员变量是通过**.->**调用。

1.1 **.**操作符:用于访问对象的成员变量和成员函数,当对象是通过值或引用传递时。

class MyClass {  
public:  
    int myVar;  
    void myFunction() {}  
};  
  
MyClass obj;  
obj.myVar = 10; // 使用.访问成员变量  
obj.myFunction(); // 使用.访问成员函数

->操作符:通常用于通过指针访问对象的成员变量和成员函数。(new)

class MyClass {  
public:  
    int myVar;  
    void myFunction() {}  
};  
  
MyClass* ptr = new MyClass();  
ptr->myVar = 10; // 使用->访问成员变量  
ptr->myFunction(); // 使用->访问成员函数  
delete ptr; // 不要忘记释放动态分配的内存

2、浅拷贝

#include <iostream>
using namespace std;

class Person
{
public:
   Person()
   {
    cout<<"无参(默认)构造函数"<<endl;
   }
   Person(int a)
   {
    age = a;
    cout<<"有参构造函数"<<endl;

   }
   //拷贝构造函数
   Person(const Person& p)
   {
     age = p.age;
     cout<<"拷贝构造函数"<<endl;
   }
   ~Person()
   {
     cout<<"析构函数"<<endl;
   }


public:
    int age;

};
void test()
{

//定义对象时,自动调用构造和析构函数
    //调用无参构造
    Person p;
    //调用有参构造
    Person p1(10);
    cout<<"p1.age:"<<p1.age<<endl;
    //调用拷贝函数
    Person p2(p1);
     cout<<"p2.age:"<<p2.age<<endl;
}

int main()
{

    test();
    return 0;
}
无参(默认)构造函数
有参构造函数
p1.age:10
拷贝构造函数
p2.age:10
析构函数
析构函数
析构函数

解释:
创建对象p时,调用了无参构造函数,输出了"无参(默认)构造函数"。
创建对象p1时,调用了有参构造函数,并传入了参数10,输出了"有参构造函数"。
创建对象p2时,通过传入p1作为参数调用了拷贝构造函数,输出了"拷贝构造函数"。
接下来,当test函数结束时,局部对象p、p1和p2会离开其作用域,此时它们的析构函数会被自动调用,输出了三个"析构函数"。

2.1 浅拷贝语法

构造函数定义:
Person(const Person& p)
{
age = p.age;
}
调用:
Person p2(p1);
即const Person &p=p1 age = p1.age; 就是将p1的年龄通过引用传给p2,且p1不变(const)

3 深拷贝

浅拷贝共用内存,导致重复释放,因此用深拷贝。
在这里插入图片描述

#include <iostream>
using namespace std;

class Person
{
public:
   Person()
   {
    cout<<"无参(默认)构造函数"<<endl;
   }
   Person(int a,int h)
   {
    age = a;
    //在堆上动态分配一个整数大小的内存,并用 h 的值初始化这块内存。
    // 并将 height 指针指向这块新分配的内存。
    height = new int(h);
    cout<<"有参构造函数"<<endl;
   }
   //拷贝构造函数
   //要赋值的参数还是age、height
   Person(const Person& p)
   {
    age = p.age;
    //重新new一个
    height = new int(*p.height);

   }

   //new了,就要delete,一般放在构造和析构,因为自动释放
   ~Person()
   {
     cout<<"析构函数"<<endl;
     if (height != NULL)
    {
       delete height;
    }

   }

public:
    int age;
    int *height;

};
void test()
{

//定义对象时,自动调用构造和析构函数
    //调用无参构造
    Person p;
    cout<<"p.age:"<<p.age<<endl;
    //调用有参构造
    Person p1(10,120);
    //调用拷贝函数
    Person p2(p1);
    cout << "p1的年龄: " << p1.age << " 身高: " << *p1.height << endl;
    cout << "p2的年龄: " << p2.age << " 身高: " << *p2.height << endl;
}

int main()
{

    test();
    return 0;
}

3.1 深拷贝语法

new一个,仍然对age、height赋值

//拷贝构造函数
   //要赋值的参数还是age、height
   Person(const Person& p)
   {
    age = p.age;
    //重新new一个
    height = new int(*p.height);

   }

new了要记得delete

//new了,就要delete,一般放在构造和析构,因为自动释放
   ~Person()
   {
     cout<<"析构函数"<<endl;
     if (height != NULL)
    {
       delete height;
    }

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

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

相关文章

【Java】:类和对象

1.面向对象的初步认知 1.1 什么是面向对象 Java是一门面向对象的语言&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序&#xff0c;更符合人们对事物的认知…

CDNS PCIe VIP debug info

1. TLP payload的顺序是反向的&#xff0c;即大小端反的&#xff0c;比如下面的denalirc打印的信息看&#xff0c;pl是我们发TLP时的配置&#xff0c;Cfg才是真正的data顺序。 而seq写的时候如下&#xff1a;可以看到payload[2]时第三个8bit payload&#xff0c;但是我们是想配…

JS加密解密之应用如何保存到桌面书签

前言 事情起因是这样的&#xff0c;有个客户解密了一个js&#xff0c;然后又看不懂里边的一些逻辑&#xff0c;想知道它是如何自动拉起谷歌浏览器和如何保存应用到书签的&#xff0c;以及如何下载应用的。继而诞生了这篇文章&#xff0c;讲解一下他的基本原理。 渐进式Web应用…

UE5学习日记——蓝图节点前缀关键字整理

一、起因 节点如海&#xff0c;中英文翻译的时候还是有差别的&#xff0c;比如&#xff1a; 同一个中文&#xff0c;可能在英文里完全不同&#xff0c;连出现位置可能都不一样 附加 Attach Actor To Component&#xff08;将Actor附加到组件&#xff09;Append Array&#xf…

【竞技宝】DOTA2-PGL联赛:niu神无解 LGD2-0轻松击败DH

北京时间2024年3月26日,PGL联赛中国区的比赛在昨日正式打响,首日共进行了四场胜者组首轮的比赛,第四场比赛由LGD对阵DH。本场比赛,DH两局都在前中期和LGD有来有回,但niu的中期节奏完全摧毁了DH,最终LGD2-0轻松击败DH。以下是本场比赛的详细战报。 第一局: 首局比赛,LGD在天辉方…

Python Flask框架 -- flask-migrate迁移ORM模型

# 之前使用的这个db.create_all()很有局限性&#xff0c;它不能把在class里修改的东西同步上数据库&#xff0c;所以不用了 # with app.app_context(): # 请求应用上下文 # db.create_all() # 把所有的表同步到数据库中去 例如&#xff0c;在User类中增加一个email字段&…

selenium自动化测试-unittest框架

unittest框架的优点 (1)能够组织多个用例去执行 (2)提供丰富的断言方法 (3)能够生成测试报告 unittest框架的核心要素 1. TestCase测试用例 TestCase(测试用例)&#xff0c;最小的测试单元&#xff0c;创建的测试类需要继承该基类 步骤&#xff1a; &#xff08;1&#x…

Vue2(十一):全局事件总线、消息订阅与发布pubsub、TodoList的编辑功能、$nextTick、过渡与动画

一、全局事件总线 1、思路解析 一种组件间通信的方式&#xff0c;适用于任意组件间通信。通俗理解就是一个定义在所有组件之外的公共x&#xff0c;这个x可以有vm或vc上的同款$on、$off、$emit&#xff0c;也可以让所有组件都访问到。 第一个问题&#xff1a;那怎样添加这个x才…

代码随想录学习Day 18

530.二叉搜索树的最小绝对差 题目链接 讲解链接 思路&#xff1a;利用二叉搜索树的性质&#xff0c;其中序遍历序列是一个有序数组。所以先对二叉搜索树进行中序遍历&#xff0c;得到一个递增的数组后&#xff0c;再遍历整个数组&#xff0c;依次求相邻值的差&#xff0c;最…

java算法汇总(蓝桥常用-->自总版)(更新中...)

这里写目录标题 1.递归求n的阶乘2.互质3.例题:奇妙的数字两个数字拼接String.toCharArray()方法String.valueOf()方法 4.例题:美丽的2String.contains()方法 5.ASCII码---a,A,0的转换6.String[] a---->求sum(a[p].charAt(q))-0;7.复数BigInteger 大整数类型本题用到的方法--…

【SSH配置公钥私钥免密登录】

SSH配置公钥私钥免密登录 SSH的安全机制一、修改远程主机ssh设置二、在windows客户端生成公钥私钥文件三、将客户端公钥追加到远程主机 .ssh/authorized_keys中参考链接 SSH的安全机制 SSH之所以能够保证安全&#xff0c;原因在于它采用了非对称加密技术(RSA)加密了所有传输的…

28---Nand Flash电路设计

视频链接 Nand flash电路设计01_哔哩哔哩_bilibili NAND FLASH电路设计 1、NAND FLASH介绍 Nand-flash内存是flash内存的一种&#xff0c;其内部采用非线性宏单元模式&#xff0c;为固态大容量内存的实现提供了廉价有效的解决方案。Nand-flash具有容量较大&#xff0c;改写…

【GPT5】牛!用ChatGPT搞科研,1天顶替博士辛苦研究3个月......

一、GPT的意义 随着人工智能技术的飞速发展&#xff0c;特别是ChatGPT、GPT-4等大型语言模型以及Midjourney、StableDiffusion等AI绘图工具的问世&#xff0c;我们已经进入了所谓的AI 2.0时代。这一时代的标志性特征是AI技术不仅在复杂性和功能性上取得了巨大进步&#xff0c;…

【PyQt】18 -菜单等顶层操作

顶层界面的使用 前言一、菜单栏1.1 代码1.2 运行结果 二、工具栏2.1 代码几种显示方法 2.2 运行结果 三、状态栏3.1 代码3.2 运行结果 总结 前言 1、介绍顶层菜单栏目的使用&#xff0c;但没有陆续绑定槽函数。 2、工具栏 3、状态栏 一、菜单栏 1.1 代码 #Author &#xff1a…

华为防火墙二层墙(VAN/SVI/单臂路由)

二层墙只能做地址池形式的NAT。 交换机安全策略防火墙二层墙 路由器安全策略防火墙三层墙 交换机的光口是不能直接插线的&#xff0c;光模块&#xff0c;包括进和出 长距离&#xff1a;单模 短距离&#xff1a;多模 防火墙自身的ping流量需要单独配置

畅捷通T+ Ufida.T.DI.UIP.RRA.RRATableController 远程命令执行漏洞

一、漏洞信息 漏洞名称:畅捷通T+ Ufida.T.DI.UIP.RRA.RRATableController 远程命令执行漏洞 漏洞类别:远程命令执行漏洞 风险等级:高危 二、漏洞描述 畅捷通TPlus适用于异地多组织、多机构对企业财务汇总的管理需求;全面支持企业对远程仓库、异地办事处的管理需求;全…

期货开户交易领域的认知偏差

在交易领域&#xff0c;目前存在以下几种认知偏差问题&#xff0c;看看你中了其中几条&#xff1a; 1、认为不亏钱比赚钱更为重要 对于绝大多数人来说&#xff0c;盈利要比亏损更受欢迎&#xff0c;从纯粹的理论上来说&#xff0c;每赚到100元和亏了100元是相同的&#xff0c…

Cadence——导出BOM清单

首先使用Allegro PCB Designer打开xxx .brd PCB制板文件 如下图&#xff0c;然后点击Tools–>Quick Reports&#xff0c;再选择Bill of Material Report或者Bill of Material Report(Condensed)&#xff0c;这两个的区别就是上面的导出的BOM物料清单中相同的器件是不会合并的…

VUE之首次加载项目缓慢

最近公司有个大型的项目&#xff0c;使用vue2开发的&#xff0c;但是最终开发完成之后&#xff0c;项目发布到线上&#xff0c;首次加载项目特别缓慢&#xff0c;有时候至少三十秒才能加载完成&#xff0c;加载太慢了&#xff0c;太影响用户体验了&#xff0c;最近研究了一下优…

Server-u配置FTP 多用户访问多目录图解

目录 一、 本案例目录环境 二、实现目标 三、实现方法 1、新建ftp域名 2、目录设置 3、用户创建 上篇文章【Server-U搭建FTP共享文件】很多朋友都私信我,希望深入了解Server-U的多用户设置,因此对多用户的访问设置进行了如下的总结。 一、