对类的理解(c++)

介绍目录:

1.类成员

1.1 成员函数

1.2 构造函数

1.2.1 对构造函数的理解

1.2.2成员初始化列表

1.2.3必须使用成员初始化列表的几种情况

1.2.4对于拷贝构造函数的参数是一个引用的理解

1.2.5对深拷贝和浅拷贝的理解

1.3析构函数

1.3.1 单继承

1.3.2 多继承

1.4 操作符重载

1.4.1复制构造函数和赋值运算符的区别

2.成员函数的重载,覆盖和隐藏

2.1成员函数的覆盖

2.2成员函数的隐藏

1.类成员

1.1 成员函数

调用成员函数时,实际上是使用对象来调用的。每个成员函数(除static成员函数外)都有一个额外的,隐含的形参this.在调用成员函数时,形参this初始化为调用函数的对象的地址。

例如: void Point3d::translate(Point3d* const this,const Point3d &pt){

this->x+=pt.x;

this->y+=pt.y;

this->z+=pt.z;

}

1.2 构造函数

若使用编译器自动生成的默认构造函数,则类中的每个成员,使用与初始化变量相同的规则来进行初始化。

a.类成员:运行该类型的默认构造函数来初始化。

b.内置或符合类型的成员的初始值依赖于对象的作用域:在局部作用域中这些对象不被初始化。在全局作用域中,他们被初始化为0。

1.2.1 对构造函数的理解

假定有一个NoDefault类,他没有定义自己的默认构造函数,却有一个接受string实参的构造函数。因为该类定义了一个构造函数,因此编译器将不合成默认的构造函数,意味着:

1)具有NoDefault成员的每个类的每个构造函数,必须在成员初始化列表中通过传递一个初始的string值给NoDefault构造函数来显示的初始化NoDefault成员。

2)编译器将不会为具有NoDefault类型成员的类合成默认构造函数,如果需要提供默认构造函数,就必须显示定义。并且默认的构造函数必须显示的初始化NoDefault成员。

3)NoDefault类型不能用作动态分配数组的元素类型。

4)NoDefault类型的静态分配数组必须为每个元素提供一个显式的初始化式

5) 如果有一个保存NoDefault对象的容器,例如vector,就不能使用接受容器大小而没有同时提供一个元素初始化式的构造函数。

总结:如果定义了其他构造函数,提供一个默认构造函数总是对的。

1.2.2成员初始化列表

对类的理解(c++)

i是内存的垃圾数字,而j为0.

在c++中,成员变量的初始化顺序与变量在类型中的申明顺序相同,而与他们在构造函数中初始化列表的顺序无关。

1.2.3必须使用成员初始化列表的几种情况

对于没有默认构造函数的类类型的成员,以及const类型的成员变量和引用类型的成员变量,都必须在构造函数的初始化列表中进行初始化。

1.2.4对于拷贝构造函数的参数是一个引用的理解

如果拷贝构造函数中的参数不是一个引用,即形如:

CClass(const CClass c_class)

相当于采用传值的方式,而此时会调用该类的拷贝构造函数,从而造成无穷递归的调用拷贝构造函数,因此拷贝构造函数的参数必须是一个引用。

1.2.5对深拷贝和浅拷贝的理解

浅拷贝:被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。

深拷贝:被复制对象的所有变量都含有与原来对象相同的值,出去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深拷贝把要复制的对象所引用的对象都复制一遍。

对类的理解(c++)

1.3析构函数

不管类中是否定义了自己的析构函数,编译器都自动执行类中非static数据成员的析构函数。

虽然构造函数不能定义为虚函数,但是析构函数可以定义为虚函数。一般来说如果类中定义了虚函数,析构函数也因该定义为虚析构函数,尤其是类中有申请的动态内存,需要清理和释放的时候。

与复制构造函数和赋值操作符不同,无论类中是否定义了自己析构函数,都会创建和运行合成析构函数,如果类中定义了析构函数,则类中定义的析构函数运行完以后运行合成析构函数。

(拷贝构造函数采用的是系统自动生成的版本,没有输出)

对类的理解(c++)

1.3.1 单继承

派生时,构造函数和析构函数是不能继承的(复制构造函数和赋值操作符重载函数也不能继承),为了对基类成员初始化,必须对派生类的构造函数和析构函数重新定义,并在派生类的构造函数的初始化列表中调用基类的构造函数。

当对象被删除时,派生类的析构函数被执行,析构函数不能继承,所以,在执行派生类的析构函数时,基类的析构函数被自动执行。(顺序:先执行派生类的析构函数在执行基类的析构函数)

1.3.2 多继承

多继承时,派生类的构造函数初始化列表需要调用各个基类的构造函数。

此时构造函数初始化列表只能控制用于初始化基类的值,不能控制基类的构造次序,基类构造函数按照基类构造函数在类派生列表中出现的次序调用。

对类的理解(c++)

在虚继承中,首先调用虚基类的构造函数,虚基类如果有多个,则虚基类构造函数的调用顺序是此虚基类在当前类派生表中出现的顺序,而不是他们在成员初始化列表中的顺序。

1.4 操作符重载

对类的理解(c++)

1.4.1复制构造函数和赋值运算符的区别

复制构造函数只在对象实例化是才会被调用,在复制构造函数调用期间,这个对象处于未决状态,复制构造函数不返回任何值。而赋值操作符是在一个现存的对象被赋予新的值时被调用。有返回值。

c++中空类默认产生默认构造函数,析构函数,复制构造函数,赋值运算符重载函数,取址运算符重载函数,const取址运算符重载函数。

operator new 和operator delete 与c中malloc和 free对应,只负责分配和释放空间。(new为new operator 是new运算符)

2.成员函数的重载,覆盖和隐藏

只用在同一类中定义的同名函数才存在重载关系,主要特点是函数的参数类型和数目有所不同,但不能出现函数参数的类型和个数相同仅仅依靠返回值来区别函数。重载和成员函数是否为虚函数无关。

对类的理解(c++)

2.1成员函数的覆盖

覆盖是指在派生类中覆盖基类中的同名函数,要求基类必须是虚函数且:

1)与基类的虚函数有相同的参数个数

2)与基类的虚函数有相同的参数类型

3)与基类的虚函数有相同的返回类型或者与基类的虚函数的相同,或者返回指针(或引用)。并且派生类虚函数所返回的指针(引用)类型是基类中被替换的虚函数所返回的指针(引用)类型的子类型(派生类型)。

对类的理解(c++)

2.2成员函数的隐藏

隐藏是在某些情况下,派生类中的函数屏蔽了基类中的同名函数,这些情况包括:

对类的理解(c++)

对类的理解(c++)

Original: https://www.cnblogs.com/mydomain/p/10159365.html
Author: 浪里飞
Title: 对类的理解(c++)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/536317/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • c++ lambda捕获this 导致多线程下类释放后还在使用的错误

    但是需要注意的是,这里捕获this,不是以一种拷贝的方式,更像是一种引用(或者别名,描述可能不准确),当在外面这个类的生命周期结束时,lambda内部还在调用这个类的成员函数,那么…

    C++ 2023年5月29日
    044
  • C++11 并发指南五(std::condition_variable 详解)

    std::condition_variable 是条件变量,更多有关条件变量的定义参考维基百科。Linux 下使用 Pthread 库中的 pthread_cond_*() 函数提…

    C++ 2023年5月29日
    059
  • Xcode 导出C++项目在其他电脑执行

    先找到C++项目的可执行文件的位置 https://blog.csdn.net/qq_34759481/article/details/82700587 关于存储和加载文件的目录,…

    C++ 2023年5月29日
    051
  • maya2018 + VS2017 C++编译环境搭建

    下载: https://www.autodesk.com/developer-network/platform-technologies/maya 解压,将devkitBase下的…

    C++ 2023年5月29日
    055
  • C++多线程库的常用函数积累和整理

    std::scoped_lock 待完成 标准库中 std::recursive_mutex提供这样的功能 一个互斥量可以在同一线程上多次上锁, 待完成 std::thread 类…

    C++ 2023年5月29日
    046
  • 【C++服务端技术】对象池

    代码没贴全,就少一个锁头文件,可以做设计参考 设计思想就是维护一个空闲链表,没有用的就重新申请,有的话就拿链表的头,使用完又还给空闲链表。 /* 一个分配固定大小内存的内存池,使用…

    C++ 2023年5月29日
    061
  • C++ register 关键字

    register 简介: register 就像是汉语和英语中的形容词(不要问为什么只有两种语言,因为小编只会这两种),在 C++ 中 register 是用来修饰变量的。 reg…

    C++ 2023年5月29日
    044
  • visual studio code的c++扩展

    posted @2020-08-20 10:07 kissrule 阅读(338 ) 评论() 编辑 Original: https://www.cnblogs.com/longc…

    C++ 2023年5月29日
    093
  • C++:继承访问属性(public/protected/private)

    我不去想是否能够成功 既然选择了远方 便只顾风雨兼程 Original: https://www.cnblogs.com/adylee/p/11432895.htmlAuthor:…

    C++ 2023年5月29日
    065
  • 【转】c++ set的用法

    1、关于set C++ STL之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector,string,list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大…

    C++ 2023年5月29日
    047
  • 对指针和引用的理解(c++)

    1.指针 typedef说明一种新类型名,来代替已有类型名。 a.案例:typedef char String_t和#define String_d char 这两句在使用上的区别…

    C++ 2023年5月29日
    052
  • C++STL之双端队列容器

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/huashanqingzhu/p/12832819.ht…

    C++ 2023年5月29日
    056
  • C++11新特性学习

    http://www.cprogramming.com/c++11/c++11-lambda-closures.html Original: https://www.cnblogs…

    C++ 2023年5月29日
    043
  • c++ union内存

    看一个例子: 输出结果: 为什么是这样的呢? 因为A是union,所以在内存中存储的格式为: 高地址 ————> 低地址 12…

    C++ 2023年5月29日
    045
  • C++多线程库的常用函数 std::this_thread::get_id()

    格式:函数 + 头文件 + 用例 + 解释说明 函数: std::this_thread::get_id() 头文件: 用例: std::thread::id master_thr…

    C++ 2023年5月29日
    038
  • 【C++】第1章 在VS2015中用C++编写控制台应用程序

    分类:C++、VS2015 创建日期:2016-06-12 看到不少人至今还在用VC 6.0开发工具学习C++,其实VC 6.0开发工具早就被淘汰了。这里仅介绍学习C++时推荐使用…

    C++ 2023年5月29日
    064
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球