我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何理解C++中的类和对象

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何理解C++中的类和对象

如何理解C++中的类和对象,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

    一.构造函数

    1.构造函数的定义:

    构造函数 是一个 特殊的成员函数,名字与类名相同 , 创建类类型对象时由编译器自动调用 ,保证每个数据成员都有 一个合适的初始值,并且 在对象的生命周期内只调用一次 。 其实构造函数的作用就是完成成员变量的初始化 ,但不同于c语言的初始化构造函数可以实在创造对象的同时就完成成员变量的初始化。

    2.构造函数的特征:

    函数名与类名相同。

    无返回值。

    对象实例化时编译器 自动调用 对应的构造函数。

    构造函数可以重载。

    3.构造函数的实现:

    构造函数的实现主要有三种,

    当用户没有实现构造函数的话系统会默认创造一个,此时系统会将内置类型的成员变量赋予随机值,而对于自定义类型的成员变量则会调用他们的构造函数。(注:内置类型一般指的是:int char double float等这些定义好的类型,自定义类型指的是:struct这种类型以及class类这种)。

    当然用户也可以自己实现构造函数,一种为无参构造

    类一种为带参构造,但是在带参构造中我们使用全缺省构造。我们用代码展示一下:

    3.1.系统默认的构造函数

    我们可以看到当我们没有在Data类进行函数构造的时系统将会自己默认创建构造函数,对内置类型变量赋予随机值,自定义类型调用自己的构造函数(若自定义类型也没有定义构造函数那么此例子中的_a1和_a2也会被赋予随机值)

    如何理解C++中的类和对象

    如何理解C++中的类和对象

    3.2无参构造

    如何理解C++中的类和对象

    如何理解C++中的类和对象

    3.3 带参构造

    这里出一个问题对于代码风格造成的问题:成员变量year最后的结果是多少呢?

    class A{public:A(int year){year = year;}private:int year;};int main(){A a(20);}

    答案是:随机值。那么为什么是随机值呢?这里主要是变量之间它采用了就近原则,所以等式左边的year会直接寻找离他最近的变量所以会将等式右边的year直接赋值给它自己,所以year最后的值就是随机值。

    如何理解C++中的类和对象

    我们继续来说带参的构造函数,我们一般推荐使用的是全缺省的构造函数(注:

    无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,三者都可以认为是默认成员函数。

    如何理解C++中的类和对象

    如何理解C++中的类和对象

    二 析构函数

    构造函数时完成对象的初始化,那么一个对象又是怎么样被销毁的呢?

    1.析构函数的定义

    与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而 对象在销毁时会自动调用析构函数,完成类的一些清理工作。

    2.析构函数的特征

    析构函数名是在类名前加上字符 ~ 。

    无参数无返回值。

    一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数 。

    对象生命周期结束时, C++ 编译系统系统自动调用析构函数。

    这里我们用栈的例子来说明析构函数的实现以及作用。

    class Stack{public:Stack(int capacity = 4){_a = (int*)malloc(sizeof(int)*capacity);if (_a == nullptr){cout << "malloc fail" << endl;exit(-1);}_top = 0;_capacity = capacity;}//析构函数的实现~Stack(){// 像Stack这样的类,对象中的资源需要清理工作,就用析构函数free(_a);_a = nullptr;_top = _capacity = 0;} private:int* _a;int _top;int _capacity;};

    这里是完成构造函数,有自己定义的析构函数的效果。同构造函数一样对于内置成员变量析构函数会置为随机值,而自定义类型则会去调用他们的析构函数。

    如何理解C++中的类和对象

    如何理解C++中的类和对象

    三 拷贝函数

    如果某些时候我们需要去复制一个对象,这样的话我们该怎么样去解决呢?

    这里我们就需要引入拷贝函数。那么什么叫做拷贝函数呢?我们应该去怎么实现呢?有什么注意事项呢?这里我们一一来说道。

    1.拷贝函数定义

    构造函数 : 只有单个形参 ,该形参是对本 类类型对象的引用 ( 一般常用 const 修饰 ) ,在用 已存在的类类型对象 创建新对象时由编译器自动调用 。

    2.拷贝函数的特性

    拷贝构造函数 是构造函数的一个重载形式 。

    拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用 。

    若未显示定义,系统生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷 贝,这种拷贝我们叫做浅拷贝,或者值拷贝。

    3.拷贝函数的实现

    拷贝函数的实现分为两种一种是系统默认,一种是自己定义。我们分别来看其效果

    class A {public:A() {          _a1 = 1; _a2 = 2;}~A() {cout << "A()" << endl;}private:int _a1;int _a2;}; class Data{public://Data(int year, int month, int day) //{//_year = year;//_month = month;//_day = day;//}Data(int year = 2022, int month = 12, int day = 12) {_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;A a;}; int main() {Data s;//拷贝函数的调用Data s2(s);return 0;}

    调用系统默认生成拷贝函数(注:这里拷贝函数的拷贝对自定义类型和内置类型的成员变量处理都是一致的完成字节序的值拷贝)

    如何理解C++中的类和对象

    如何理解C++中的类和对象

    图1 调用系统默认生成的拷贝函数

    图2 调用用户自己定义的拷贝函数

    在这里我们顺便说一下在自定义拷贝函数的时候一定要使用引用不然会出现无限递归例如 Data(Data s){}正确的使用是Data (const Data & s){}其中const是为了保护原数据不被轻易改动。

    class A {public:A() {          _a1 = 1; _a2 = 2;}~A() {cout << "A()" << endl;}private:int _a1;int _a2;}; class Data{public://Data(int year, int month, int day) //{//_year = year;//_month = month;//_day = day;//}Data( const Data &s) {_year = s._year;_month = s._month;_day = s._day; }Data(int year = 2023, int month = 12, int day = 12) {_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;A a;}; int main() {Data s;//拷贝函数的调用Data s2(s);return 0;}

    我们可以发现s2均完整的赋值了s的内容,但是这里真的就没有问题了吗?如果我们使用系统默认生成的拷贝函数成员变量中含有指针那么会出现什么样的问题呢?

    class String{public:String(const char* str = "jack") {_str = (char*)malloc(strlen(str) + 1);strcpy(_str, str); }~String() {cout << "~String()" << endl;free(_str); }private:char* _str;};int main(){String s;String s1(s);}

    如何理解C++中的类和对象

    如何理解C++中的类和对象

    我们可以看到虽然虽然s1拷贝了s的内容但是最后系统还是抛出了错误那么这个错误来自那里呢?

    我们看这幅图

    如何理解C++中的类和对象

    这里就是我们之前说的系统默认生成的拷贝函数是浅拷贝。

    总结

    本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

    看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    如何理解C++中的类和对象

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    如何理解C++中的类和对象

    如何理解C++中的类和对象,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一.构造函数1.构造函数的定义:构造函数 是一个 特殊的成员函数,名字与类名相同 , 创
    2023-06-25

    怎么理解C++中的类和对象

    怎么理解C++中的类和对象,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。c++类的由来(或者说为什么要增加类):我们知道c语言是面向过程的语言,c++是即面向过
    2023-06-25

    c++中对象和类的关系

    在 c++ 中,对象是类的具体实例,类是对象蓝图。对象拥有类的特性(数据成员)和行为(成员函数),而类定义对象的特性和行为规范。对象通过类创建,使用类成员函数访问特性和行为,而类则不能直接使用对象,但可以通过静态成员函数访问对象共享的数据或
    c++中对象和类的关系
    2024-05-10

    c++中类和对象的区别

    类是创建对象的模板,而对象是类的实例。主要区别包括:抽象与具体:类是抽象实体,对象是具体实例。数据封装:类定义数据结构和访问权限,对象包含实际数据值。行为封装:类定义方法,对象可执行这些方法。类和对象的区别在 C++ 中,类是一个模板或蓝
    c++中类和对象的区别
    2024-05-08

    c++中类和对象的关系

    类定义数据和操作,而对象是类的具体实例,包含并执行这些数据和操作。类提供通用模板,对象是模板的实现;类定义属性和行为,对象存储数据值并执行行为;类是静态的,对象是动态的;对象实例化自类,继承其数据和操作;类支持派生类和多态性。C++ 中类和
    c++中类和对象的关系
    2024-05-08

    c++中如何使用类和对象掌握目标

    在 c++ 中创建类和对象:使用 class 关键字定义类,包含数据成员和方法。使用对象名称和类名称创建对象。访问权限包括:公有、受保护和私有。数据成员是类的变量,每个对象拥有自己的副本。方法是操作数据成员的函数,有成员函数和静态函数之分。
    c++中如何使用类和对象掌握目标
    2024-05-14

    C++中类和对象是什么

    这篇文章给大家分享的是有关C++中类和对象是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。类和对象<上>面向对象一直以来都是面向过程编程比如C语言,直到七十年代面向过程编程在开发大型程序时表现出不足,计算机界
    2023-06-29

    C++抽象基类如何理解

    本篇文章为大家展示了C++抽象基类如何理解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。下面来聊聊抽象基类(abstract base class简称ABC)。我们之前说过,在我们实现继承的时候,需
    2023-06-26

    如何理解C++对象模型和this指针

    本篇内容主要讲解“如何理解C++对象模型和this指针”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解C++对象模型和this指针”吧!对象模型成员变量和成员函数分开存储一、只有非静态成员
    2023-06-25

    C++中怎么创建类和对象

    在C++中,可以通过关键字class来创建类,通过关键字new来创建对象。以下是一个简单的示例:#include // 定义一个类class MyClass {public:void myFunction() {
    C++中怎么创建类和对象
    2024-03-11

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录