iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >如何理解C++中的类和对象
  • 615
分享到

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

2023-06-25 14:06:09 615人浏览 安东尼
摘要

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

如何理解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++中的类和对象

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

    总结

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

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

    --结束END--

    本文标题: 如何理解C++中的类和对象

    本文链接: https://www.lsjlt.com/news/305337.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

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

    下载Word文档
    猜你喜欢
    • 如何理解C++中的类和对象
      如何理解C++中的类和对象,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一.构造函数1.构造函数的定义:构造函数 是一个 特殊的成员函数,名字与类名相同 , 创...
      99+
      2023-06-25
    • 怎么理解C++中的类和对象
      怎么理解C++中的类和对象,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。c++类的由来(或者说为什么要增加类):我们知道c语言是面向过程的语言,c++是即面向过...
      99+
      2023-06-25
    • C++中对象&类的深入理解
      什么是对象 任何事物都是一个对象, 也就是传说中的万物皆为对象. 对象的组成: 数据: 描述对象的属性 函数: 描述对象的行为, 根据外界的信息进行相应操作的代码...
      99+
      2024-04-02
    • c++中类和对象的关系
      类定义数据和操作,而对象是类的具体实例,包含并执行这些数据和操作。类提供通用模板,对象是模板的实现;类定义属性和行为,对象存储数据值并执行行为;类是静态的,对象是动态的;对象实例化自类,...
      99+
      2024-05-08
      c++
    • c++中对象和类的关系
      在 c++ 中,对象是类的具体实例,类是对象蓝图。对象拥有类的特性(数据成员)和行为(成员函数),而类定义对象的特性和行为规范。对象通过类创建,使用类成员函数访问特性和行为,而类则不能直...
      99+
      2024-05-10
      c++
    • c++中类和对象的区别
      类是创建对象的模板,而对象是类的实例。主要区别包括:抽象与具体:类是抽象实体,对象是具体实例。数据封装:类定义数据结构和访问权限,对象包含实际数据值。行为封装:类定义方法,对象可执行这些...
      99+
      2024-05-08
      c++
    • 【C++】类和对象(四)
      1.初始化列表: 1.1为什么要有初始化列表? 实验代码如下: class A{public: int _a1;//声明 int _a2; const int _x;};int main(){ A aa;//...
      99+
      2023-08-30
      c++ java 算法
    • C++类和对象基础详解
      目录一、类和对象的基本概念结构化程序设计面向对象的程序设计使用类的成员变量和成员函数二、类和对象基础 类成员的可访问范围构造函数(constructor)基本概念拷贝(复制)构造函数...
      99+
      2024-04-02
    • Python 和 Linux:如何理解数据类型和对象?
      Python 和 Linux 是两个非常流行的开源项目。Python 是一种动态、面向对象、解释型语言,而 Linux 是一种开源的操作系统。虽然 Python 和 Linux 是两个不同的项目,但是它们之间有一个共同的概念:数据类型和对...
      99+
      2023-11-08
      linux 数据类型 对象
    • 【C++】类和对象(三)
      类和对象(三) 拷贝构造函数: 当我们想要将一个已确定的类变量的值拷贝给另外一个相同类型的类变量,有什么快捷的方法吗? 就相当于定义了一个int类型的i=10,想将i复制给一个刚初始化的遍历j,int...
      99+
      2023-08-31
      c++ java 开发语言
    • 详解C++之类和对象(2)
      目录一.构造函数1.构造函数的定义:2.构造函数的特征:3.构造函数的实现:3.1.系统默认的构造函数3.2无参构造3.3 带参构造二 析构函数1.析构函数的定义2.析构函数的特征三...
      99+
      2024-04-02
    • 详解C++之类和对象(1)
      目录C语言和C++的一大区别struct和class的区别总结c++类的由来(或者说为什么要增加类):我们知道c语言是面向过程的语言,c++是即面向过程又是面向过程的语言。那么这两个...
      99+
      2024-04-02
    • C++中类和对象是什么
      这篇文章给大家分享的是有关C++中类和对象是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。类和对象<上>面向对象一直以来都是面向过程编程比如C语言,直到七十年代面向过程编程在开发大型程序时表现出不...
      99+
      2023-06-29
    • c++中如何使用类和对象掌握目标
      非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
      99+
      2024-05-14
    • C++OOP对象和类的详细讲解
      目录C++OOP对象和类1.预备知识2.抽象和类2.1 数据抽象2.2 类2.3 接口3.C++中的类和对象3.1 C++类的定义3.2 C++对象的定义3.3 C++访问数据成员3...
      99+
      2024-04-02
    • 如何理解C++对象模型和this指针
      本篇内容主要讲解“如何理解C++对象模型和this指针”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解C++对象模型和this指针”吧!对象模型成员变量和成员函数分开存储一、只有非静态成员...
      99+
      2023-06-25
    • C++ 再识类和对象
      目录类的6个默认成员函数构造函数1.概念2.特性隐式构造函数无参和全缺省的函数均为默认构造函数成员变量的命名风格补充析构函数1.概念2.特性c++编译器在对象生命周期结束时自动调用析...
      99+
      2024-04-02
    • C++抽象基类如何理解
      本篇文章为大家展示了C++抽象基类如何理解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。下面来聊聊抽象基类(abstract base class简称ABC)。我们之前说过,在我们实现继承的时候,需...
      99+
      2023-06-26
    • C++类和对象之多态详解
      目录多态基本概念和原理剖析多态案例1 计算器类纯虚函数和抽象类多态案例2 制作饮品虚析构和纯虚析构多态案例3 电脑组装多态基本概念和原理剖析 多态:多态是C++面向对象的三大特性之一...
      99+
      2024-04-02
    • C++类和对象补充
      目录一. 再看构造函数1.函数体内赋初值2.初始化列表几点注意3.explicit关键字二.static成员1.概念2.特性三.友元1.友元函数2.友元类四.内部类总结一. 再看构造...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作