
C++57个入门知识点
文章平均质量分 84
C++57个入门知识点主要介绍了C++中基本知识点,文章较为详细,可以作为C++中开发的参考学习资料。博文内容的编写方式将会作为后期发表博文的模板。
十月旧城
winter is coming
展开
-
C++57个入门知识点_番外5_extern 关键字详解
声明:告诉编译器变量或函数的名称和类型,但不分配内存。例如,extern int x;只是声明变量x,不定义它。定义:不仅声明变量或函数,还分配内存。例如,int x = 42;定义并初始化变量x。转载 2024-10-16 22:15:08 · 62 阅读 · 0 评论 -
C++57个入门知识点_番外4_静态链接与动态链接中LIB和DLL的区别与使用
动态链接中的LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。静态链接中的LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。原创 2023-09-13 16:08:41 · 170 阅读 · 0 评论 -
C++57个入门知识点_番外3_指针作为参数传递实现被调函数修改指向值
当我们传递的是P这个指针本身的地址时,他就是一个二级指针,因为它内部还存了一个地址,而*P取的就是二级指针中存放的那个地址。②并且子函数中的赋值并不是修改了test这个内存中的内容,而是让形参的指针指向了另一块地址,所以从始至终main函数中P指向的地址和内容始终没有变化,这也就造成了我们修改内容不成功。以上代码指针P本来指向的是字符常量区的test的空间,现在把P这个指针的地址作为实参传递给子函数,在子函数中让P指向另外一段空间,那么main函数中再输出P的值是多少呢?上图代码可以用下图来表示。转载 2023-08-30 14:38:05 · 180 阅读 · 0 评论 -
C++57个入门知识点_番外2_C++中指针函数、函数指针和返回值为函数指针的函数
顾名思义,指针函数即返回指针的函数。类型名 *函数名(函数参数表列);其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址),“类型名”表示函数返回的指针指向的类型”。“(函数参数表列)”中的括号为函数调用运算符,在调用语句中,即使函数不带参数,其参数表的一对括号也不能省略。转载 2023-08-20 11:53:08 · 214 阅读 · 0 评论 -
C++57个入门知识点_番外1_C++指针偏移在类中的应用及指针偏移原理
这是对C++指针偏移介绍比较好的博文,但是比较分散,我把其进行了整理,原博文地址请见最后,讲的很详细。原创 2023-06-20 21:02:14 · 642 阅读 · 0 评论 -
C++57个入门知识点_57 异常处理(为了程序健壮性,使用try{}catch(){}将代码包裹,出现异常时可以被程序接到,而不会造成程序阻塞或崩溃;需要在VS中打开设置;exception类)
本篇作为C++基础知识的最后一篇,介绍如何进行代码中的异常处理。1.为什么需要异常处理?在代码调试过程中我们可能会碰到报异常的情况,为了确定是哪块异常并解决,就需要确定异常位置及显示。2.C++中异常处理如何写?首先利用try{} catch(){}函数分别进行异常的抛出及捕捉//在写代码的过程中,利用try、catch包住代码,catch就可以捕捉显示异常 //异常处理 try { //抛出异常 int t = m / n; //0xc0000005异常指针访问异常,地址不存原创 2021-11-08 11:50:40 · 2383 阅读 · 0 评论 -
C++57个入门知识点_56 类模板(类模板定义:对某一个类型进行变量的替换,类模板放在.h文件中;类模板只能显式实例化;类模板在类内及类外的写法;类模板的函数特例)
1.类模板的定义//类模板//对某一个类型进行变量的替换//类模板放在.h文件中.h#pragma once//类模板//对某一个类型进行变量的替换//类模板放在.h文件中//类模板的定义格式如下://支持多个及默认参操作//template模板关键字、<typename T, typename K = double, int n = 5>类中包含的数据类型//class CTest {}为类定义,其中T,K作为数据类型使用,类似于Int,double等,不好懂时用I原创 2021-11-08 10:54:11 · 388 阅读 · 0 评论 -
C++57个入门知识点_55 函数模板(template<typename T>;T GetMin(T a, T b){};函数模板定义;隐式实例化;显式实例化;函数模板特例;实例化后模板才有效)
本篇解决以下几个问题:1.什么是模板?使用模板的原因?模板是为了解决函数在使用过程中只是数据类型发生变化,而内容未发生变化,这个时候就可以使用模板来表示多种数据类型的状况。打个比方,同样的凉拌菜调味配方,你可以用来这个调味配方,凉拌个黄瓜,也可以凉拌个猪耳朵(可变的就是黄瓜和猪耳朵)。2.函数模板的定义?//模板--核心:把某些类型(int double...)的关键字看成是变量(函数重载的泛化)template<typename T>T GetMin(T a, T b){ r原创 2021-11-08 10:03:31 · 266 阅读 · 0 评论 -
C++57个入门知识点_54 转换运算符(前缀/后缀++写法;new重载方法;转换运算符:将自定义的类转换为我们想要转换的类型)
1. 四种运算符重载:(1)前缀++写法,++n有效CInt operator++() { return m_int++; }(2)后缀++写法,n++有效CInt operator++(int) { return m_int++; }(3)new重载//new是一种运算符 void* operator new(size_t cb) { return new char[cb]; }(4)转换运算符使用不多,但是一个小的知识点#include <iostr原创 2021-11-05 16:34:03 · 312 阅读 · 0 评论 -
C++57个入门知识点_53 运算符重载方式:类成员的运算符重载及友元全局的运算符重载(operator:算数+-、关系运算==<>、逻辑&&||、条件(三元运算);实现运算符重载的两种方式)
本篇涉及两个内容:类成员的运算符重载、友元全局的运算符重载此处没有搞得很懂,先把视频及笔记留下,后期要使用的时候再来看。1.学习视频地址:类成员的运算符重载及友元全局的运算符重载2.学习笔记:#include <iostream>/*1.类成员的运算符重载2.友元全局的运算符重载*/class CMystring {public: //类成员的运算符重载 CMystring& operator=(const char* psz)//=的运算符重载,返回值为CM原创 2021-11-05 16:08:30 · 219 阅读 · 0 评论 -
C++57个入门知识点_52 cin&cout的奥秘(文件和流;cin是istream的对象,cout是类ostream的对象;endl本质是函数;<<(左移运算符)是一种运算符重载)
前面课程中关于输入输出均使用C语言中的scanf()和printf()来代替,而一致没有使用cin&cout,本篇将会讲cin&cout的奥秘。作为C++语言的入门一般都是从以下代码开始的#include <iostream>using namespace std;//可写可不写,标准库的所有函数都在标准的std命名空间中int main(int argc,char* argv[]){ cout << "hello world!" << e原创 2021-11-05 11:39:33 · 717 阅读 · 0 评论 -
C++57个入门知识点_51 运算符重载引出和简要介绍(作用:使代码简洁;运算符重载定义:重载已有运算符,赋值新功能;运算符重载本质还是函数调用,operator+=即为函数名;有些可重载有些不可以)
运算符重载定义重载已有运算符,赋值新的功能。原创 2021-11-05 10:57:33 · 169 阅读 · 0 评论 -
C++57个入门知识点_50 菱形继承与虚继承(C++中语法允许多重继承造成菱形继承;会造成近亲结婚的问题;可以通过虚继承的方式解决;实际项目中不多用多重继承)
1.菱形继承在C++中如果A是B、C的父类,而D又多重继承于B、C,组成的继承关系很像一个菱形,我们把这种继承关系称之为菱形继承。这种继承关系,天生的语法缺陷,会导致D的对象在调用A中的成员时,存在调用不明确的问题。这就像:生物上三代以内不能结婚,否则可能将隐形的基因显示在子代中,菱形继承就是一种近亲结婚现象原创 2021-11-05 10:22:37 · 919 阅读 · 0 评论 -
C++57个入门知识点_49 多重继承与组合(一个类同时具有多个类的属性的方法:多重继承或者组合;多重继承:一个类同时继承多个类;多重继承构造和析构的顺序与普通继承类似;组合:类中包含多个成员对象)
如果想要一个类同时具有两个类的属性,有两种方法可以选择,一个是多重继承,一个是组合,但由于继承可能导致一些问题,因此较为推荐的是组合的方法实现。1.多重继承与组合(1)多重继承多重继承的写法如下://某一个类既有沙发又有床的特点//多重继承class CSofaBed :public CSofa, public CBed{public: CSofaBed() { printf("CSofaBed()\r\n"); } ~CSofaBed() { printf("~CSofaBe原创 2021-11-04 16:14:03 · 1075 阅读 · 0 评论 -
C++57个入门知识点_48 接口类+纯虚函数与抽象类(接口类:父类只是为了子类提供接口,规范子类对外使用的接口;包含纯虚函数的类成为抽象类;接口类可以是抽象类也可以不是;纯虚析构一定要有实现)
本篇介绍两个概念,纯虚函数和抽象类。这两个概念并不是C++所独有的语法,而是面向对象的语言都会有的。在C++中抽象类的概念比较重要,需要大家进行理解。总结:1. 接口类:父类只是为了子类提供接口,将具有这种性质的类称为接口类;2. 纯虚函数和抽象类:在虚函数后边加上=0 virtual void Run()=0;,表示该函数不需要实现代码,也代表该类不需实例化纯虚函数如果没有实现,那么包含该纯虚函数的类是 抽象类,抽象类不能实例化3. C++中对接口类和抽象类并没有严格的区分,主要是概念上的原创 2021-11-04 15:04:51 · 392 阅读 · 0 评论 -
C++57个入门知识点_47 虚函数的多态性(成员函数中的虚函数具有多态性;构造和析构函数中,虚函数没有多态性;在构造析构函数中调用普通成员函数,该普通成员函数中有虚函数的间接调用,没有多态)
1. 本篇主要介绍两个问题:(1)成员函数中,虚函数是否有多态性?答案:有(2)构造和析构函数中,虚函数是否有多态性?答案:无2.上面两个问题的原因呢?class CParent{public: CParent() { //1.在析构函数中调用虚函数,实际上是直接调用,所以没有多态 //儿子还没构造好,不能调用 foo(); //2.在析构函数中调用普通成员函数,该普通成员函数中有虚函数的间接调用 //由于进入构造时,会为对象赋值为当前类的虚表,所以没有多态 tes原创 2021-11-04 10:11:14 · 181 阅读 · 0 评论 -
C++57个入门知识点_46 虚析构函数的作用(当类之间存在继承关系时,最后做析构时有可能析构不完全,父子类中同时使用虚析构函数,通过查询虚表就可以解决这样的问题)
1.为什么建议析构函数为虚函数?本篇很重要的内容就是:为什么析构函数最好为虚函数?答案就是:当类之间存在继承关系时,最后做析构时有可能析构不完全,使用虚析构函数就可以解决这样的问题。2.为什么会虚函数可以解决上面提到的析构不完全的问题呢?(1) 对于父子类,两个类的析构函数都不是虚函数,儿子对象的指针赋值给父亲情况出现,并进行析构时会少了一次子类的析构。#include <iostream>class CParent {public: CParent() { printf("原创 2021-11-03 16:17:02 · 246 阅读 · 0 评论 -
C++57个入门知识点_45 友元的实现及作用(friend;类B可以访问A私有成员;分类:普通友元函数-普通函数是A类友元、友成员函数-B类成员函数是A类友元、友元类-类B可以访问类A的所有的成员)
1.友元的作用通过友元的使用,可以使用另一个类的私有成员,打破私有成员的私有性(破坏了封装性),在必要的情况下才会使用。2.友元的基本形式形式有三种://1.普通的友元函数//2.友元成员函数//3.友元类原创 2021-11-03 13:48:32 · 334 阅读 · 0 评论 -
C++57个入门知识点_44:单例的实现与理解(单例:提供唯一类的实例;静态对象的存储位置及生命周期;静态对象指针实现单例(懒汉式,较多用);静态对象引用实现单例(更安全),禁用拷贝构造)
结构简单的代码在需求发生改变之后大概率就需要伤筋动骨的去修改的,使用一定的模式,就可以提高代码的复用率。大项目一般都是喜欢使用各种模式。本篇在学习完静态成员变量及函数后介绍用其实现单例模式。总结放于前:(1)懒汉式单例:类的构造函数放于private中,通过static创建带类域的静态成员函数作为创建对象的接口,需要使用静态对象指针在没有创建对象的情况下赋给对象指针,有的话就直接返回静态指针,这样就可以实现单例的目的。(2)利用静态对象引用的方式实现单例需要禁用拷贝构造及等号运算符重载。1. 单例的原创 2021-10-19 16:51:44 · 598 阅读 · 1 评论 -
C++57个入门知识点_43:静态成员函数(static静态成员函数声明,实现和调用;静态函数内部只能访问静态成员变量;本质是静态成员函数没this指针;带类域的全局函数可直接利用类调用静态成员函数)
学习完静态成员变量,趁热打铁,学习静态成员函数,其基本性质及使用如下: //静态成员函数 //(1)在头文件的函数名前面加上关键字static //(2)函数内部不能访问普通成员变量,只能访问普通成员变量 //(3)本质是静态成员函数中没有this指针 //(4)静态成员函数本质上就是带类域的全局函数,可以避免名称冲突的问题 //(5)在线程及回调函数中会用到静态成员函数,用作线程的回调函数的声明项目结构如下:代码及注释如下:CIntreger.h:class CInteger{原创 2021-10-21 20:07:39 · 946 阅读 · 0 评论 -
C++57个入门知识点_42:静态成员变量理解(static int m_nStatic;实现单独写在类外;本质是带类域的全局变量;可以不用产生对象即可访问CInteger::m_nStatic=1)
接上篇C++57个入门知识点_41 常成员变量及初始化列表的基础上,本篇介绍static静态成员变量的定义,性质等。先给出静态成员变量的使用及性质总结,下面一项项进行解释: //静态成员变量 //(1)实现要单独的写在类外(cpp中,不写在.h中) //(2)默认会用0对该成员进行初始化 //(3)静态成员变量是不同的对象(同一个类)公用的,不占用某个对象的大小 //(4)本质:带类域的全局变量,虽然是全局变量但是有类域的限制,解决名称限制 .h中声明: static int m_nStati原创 2021-10-20 22:09:05 · 528 阅读 · 0 评论 -
C++57个入门知识点_41_初始化列表实现常成员变量和成员对象的初始化(初始化列表可以用于初始化普通成员变量/常成员变量(注意新旧编译器的写法,建议用旧的);也可以用来初始化有参数的成员对象)
1.初始化列表总结C++57个入门知识点_31 初始化列表及派生类中的函数隐藏(初始化列表:用于调用父类有参构造并初始化、用于自身成员初始化、对于常量成员初始化;函数隐藏:不同作用域里两个数据名称相同,由内向外隐藏)关于初始化列表在构造函数章节也有过介绍,此处首先对初始化列表的使用做一总结://初始化列表//1.可以用于初始化普通成员变量/常成员变量//2.通常是用来构造有参数的成员对象对于常成员变量,在高版本的编译器中采用如下形式进行初始化是没有问题的。//const int m_nTes原创 2021-11-03 10:00:57 · 426 阅读 · 0 评论 -
C++57个入门知识点_40 常成员函数(用于定义不可修改类内部成员变量的函数,一般用来修饰Get函数;常成员函数this指针:const T* const;常成员函数内部变量修改方法:强转/关键字)
1.常成员函数的总结如下:2.与普通类成员函数对比 //const常成员函数,声明修改 //1.普通的类成员函数this指针类型:T* const(表示该指针本身不能被修改) //2.常成员函数this指针类型:const T* const //(1)表示该指针本身不能被修改 //(2)表示指针指向的内容不能被修改3.学习视频地址:常成员函数4.学习笔记#include <iostream>class CInteger{public: CInteger(int原创 2021-11-02 20:41:39 · 4131 阅读 · 0 评论 -
C++57个入门知识点_38_39 函数覆盖、重载、隐藏的调用秘笈-实践中理解(按照函数隐藏-->函数重载-->函数覆盖顺序进行检查)
本篇主要介绍C++中函数覆盖、重载、隐藏如何判断什么时候被使用?实际使用过程中很少会出现几种类型一起出现的情况,因此作为理解及未来细品之用。1.总结:2.学习视频地址:函数覆盖、重载、隐藏的调用秘笈1函数覆盖、重载、隐藏的调用秘笈23.学习笔记:#include <iostream>class Base {public: virtual void Handle1(float x) { printf("Base::Handle1(float)"); } void原创 2021-11-02 14:57:11 · 1044 阅读 · 0 评论 -
C++57个入门知识点_37 虚函数的直接调用与间接调用(函数的调用分为直接调用和间接调用,间接调用是虚函数所具有的的性质;间接调用:运行期通过查找对象的虚表下标来调用函数的方法)
本篇介绍虚函数的直接调用与间接调用。1.先做一总结,下面对其各个特性进行演示/*虚函数的调用方式:1.直接调用 根据函数名称,直接调用该函数(编译器在编译时候就确定了) (1)普通的函数调用 (2)对象的普通成员函数的调用 (3)对象的虚函数调用2.间接调用(虚调用,即通过查虚表来调用函数) 虚函数,通过查找对象的虚表下标来调用函数的方法(在运行时期确定调用谁) (1)通过对象的指针调用虚函数 (2)通过对象的引用调用虚函数*/(1)通过对象的指针调用虚函数 CChinese原创 2021-11-02 10:10:06 · 1077 阅读 · 0 评论 -
C++57个入门知识点_36 函数覆盖的概念2( 虚表大小由编译器在编译时确定;虚表中虚函数的顺序:父类虚函数顺序决定了子类虚函数的顺序,子类自己的虚函数会出现在自己虚表中父类对应所定义的虚函数后面)
接上篇,继续介绍函数覆盖。1.关于虚表的大小及虚函数的总结如下:/*函数覆盖(虚函数)1.作用域不同(父子类之间继承关系)2.函数名,参数列表(参数个数、顺序、类型),返回值,调用约定(_thiscall)必须相同3.有virtual关键字-虚表大小的确定1.由编译器在编译时确定的2.在运行时内存中并没有个数的表示3.并不是以00结尾-虚表中虚函数的顺序1.子类继承了所有的父类父类虚函数(公有),虚函数一般都为父类的2.父类虚函数顺序决定了子类虚函数的顺序3.子类重写了父类的原创 2021-11-01 21:19:55 · 271 阅读 · 0 评论 -
C++57个入门知识点_35 函数覆盖的概念1(函数覆盖条件:父子类继承关系、函数名&参数列表&返回值&调用约定必须相同、有virtual关键字;函数覆盖:类虚表中成员函数从继承自父类变为自己的)
1.在理解函数覆盖之前,先将函数重载、函数隐藏、函数覆盖做一总结:2.函数覆盖(虚函数)特点1.作用域不同(父子类之间继承关系)2.函数名,参数列表(参数个数、顺序、类型),返回值,调用约定(_thiscall)必须相同3.有virtual关键字3:函数在覆盖与不覆盖下的特点(1)当派生类中没有相应的函数,也就是不存在覆盖时运行结果如下子类父类对象调用的是父类对应的函数(2)当派生类中有相应的函数,也就是存在覆盖时运行结果如下子类父类对象调用的是自身对应的函数(3)一张图作为总结原创 2021-11-01 16:19:53 · 898 阅读 · 0 评论 -
C++57个入门知识点_34_虚函数的模拟实现-理解(利用函数指针替代virtual的虚函数功能;虚函数的本质即为函数的覆盖,子类一旦对父类同名成员函数重载,对象在调用时使用的是子类的函数)
前面介绍了虚函数是以间接引用的方式实现“不同国家的人说不同语言”的功能,本篇对其过程进行了模拟实现。1.步骤总结://(1)找到对象头部四个字节--虚表//(2)根据虚函数的位置(在cpp中定义的顺序),确定该虚函数在虚表的下标//(3)找到对应的虚函数地址,直接调用该地址用下图也可以看出2.学习视频地址:虚函数的模拟实现3.学习笔记(1)整体结构如下图:(2)Chinese.h/cppChinese#pragma once#include <iostream>#原创 2021-11-01 15:06:35 · 425 阅读 · 1 评论 -
C++57个入门知识点_33_深入理解虚函数的原理-重点(间接调用:先查虚表地址,再查虚表中的虚函数指针;编译器先取对象的前4个字节地址,再取对应地址下函数指针;查看内存、反汇编的方法;成员函数指针)
接上文,本文从内存角度理解虚函数。(1)首先看一下virtual加和不加对内存大小的影响:不加virtual class CPerson { ... void speak() { //printf("说人话\r\n");...};三个类的大小:加virtual class CPerson { ... virtual void speak() { //printf("说人话\r\n");...};三个类的大小:(2)为什么加了virtual会比不加vir原创 2021-10-31 21:34:02 · 414 阅读 · 0 评论 -
C++57个入门知识点_32 初识多态及虚函数-核心(加virtual的函数称为虚函数;某一个函数在父子类有不同实现,运行时对象自行决定调用哪一类实现;没virtual调父类同名函数,否则调子类函数)
1.什么是多态:某一个函数在父类子类有不同的实现,运行时对象自行决定调用哪一个类下实现(1)常规下我们要实现,一个房间多国人,不同国家的人说不同的话#include <iostream>//面向对象:多态class CPerson {public: CPerson() { } void speak() { printf("说人话\r\n"); }};class CChinese :public CPerson {public: CChinese()原创 2021-10-30 11:19:18 · 430 阅读 · 0 评论 -
C++57个入门知识点_31 初始化列表及派生类中的函数隐藏(初始化列表:用于调用父类有参构造并初始化、用于自身成员初始化、对于常量成员初始化;函数隐藏:不同作用域里两个数据名称相同,由内向外隐藏)
1.初始化列表**作用:**用于调用父类的有参构造并做初始化、用于对于自身成员初始化、对于常量成员的初始化形式:CStudent():CPerson(123,345), m_nStuID(4),n(7)范例://初始化列表 //1.用来调用父类的有参构造//2.用于对于自身成员初始化//3.对于常量成员的初始化典型如下:class CStudent :public CPerson{public: //儿子指定调用父亲哪一个有参构造,子类给父类传参数 //也可以对当前类的成员进行原创 2021-10-30 10:33:04 · 392 阅读 · 0 评论 -
C++57个入门知识点_30 父子类,成员类构造析构顺序(存在父子和成员类的构造析构:构造:父类->成员类->自己;析构:自己->成员类->父类;成员类:A类对象作为B类成员,A为B成员类或朋友类)
1.父子类、成员类构造析构顺序概念:什么是成员类?A类的对象作为B类的成员,A即为B的成员类//派生类构造顺序//1.先父类//2.后子类//派生类的析构顺序//1.先子类//2.后父类//成员类构造顺序//1.先成员类//2.后自己//成员类的析构顺序//1.先自己//2.后成员类(1)父子类的构造析构顺序结果如下图:(2)成员类的构造析构顺序(3)子类中包含成员类的构造析构顺序(CTest为成员类):2.学习视频地址:父子类,成员类构造析构顺序3.学习原创 2021-10-30 09:35:30 · 1035 阅读 · 0 评论 -
C++57个入门知识点_29 从内存角度看继承(子类继承时包含(复制)了父类所有成员变量,但由于继承的可见性,只可对部分进行访问;运行时可修改父类成员;子类转父类安全,父类转子类不安全(越界访问))
1.知识点总结:(1)运行时子类的继承部分指针指向父类地址,父类所有成员都包含在子类中,但由于可见性的设置,只可以看到没有限制的成员。//继承的可见性在何时做的检查?//是由编译器在编译时刻做的限制,本质上可以在运行时可以通过指针修改//继承时父类将所有成员赋给了子类,继承部分指针指向父类的内存//但是由于可见性问题,只能看到没有做限制的成员从下图&stu指针指向的内存可以看到,子类中包含了父类的内容(2)如何在运行后修改指针内数据? //取stu中 m_nszName[255]原创 2021-10-30 08:55:20 · 415 阅读 · 0 评论 -
C++57个入门知识点_28 继承的可见性(父类成员在子类中可见性;影响因素:父类内部关键字+继承位置关键字;父亲某属性成员,变为儿子中某种属性成员;编译期检查访问权限,子类对象内存包含父类所有成员)
1.针对父类中的成员在子类中继承的理解://父亲公有的都可以访问public : int m_nPublic;//父亲的家族财产给儿子继承protected: int m_nProtected;//父亲的私有财产不能给儿子继承private: char m_nszName[255]; int m_nGender;2.子类继承父类,父类中成员的可见性:关键点:两个权限取在一起,取最严格的//继承的可见性:/*保护成员(protected):保护成员除了自身或者派生类以外,不能在原创 2021-10-29 20:57:45 · 643 阅读 · 0 评论 -
C++57个入门知识点_27 继承的概念(类的组合关系:将一个类的对象作为另外一个类的成员;类的组合关系的访问;继承的概念:A类是B的儿子;A被称为子类,B被称为父类或者A被称为派生类,B被称为基类)
在介绍继承之前相似的类之间有一种组合关系:即将一个类的成员作为另一个类的成员(共用人的共性)在此例中人具有性别等学生和老师的共有成员,但是学生和老师都有自身的特点那就是有学号和老师号,这个时候就可以用组合关系,让学生和老师类共用人的共有成员。实现代码如下:#include <iostream>//面向对象:继承//学生与老师具有人的共有特征class CPerson {public: CPerson() { } ~CPerson() { } int .原创 2021-10-29 20:20:27 · 459 阅读 · 0 评论 -
C++57个入门知识点_26 new与delete使用注意事项(当申请一个堆上对象时,使用new和delete需配对,不能用malloc和free替换;new[]与delete[]数组操作要配套使用)
1.本篇介绍new与delete使用注意事项如下://1.当申请一个堆上的对象时,使用new和delete需要配对,不能用malloc和free替换//2.当使用普通成员的时候,new和delete,malloc和free是可以相互替换的//3.new[]分配数组,delete[]释放数组空间//4.new[]与delete[]要配套使用(特别是申请对象数组时)//5.VS编译器会在new[]申请对象数组时,在堆开始前的4个字节,写入当前数组的长度,用于记录delete[]释放时,析构调用次数。原创 2021-10-29 19:39:04 · 346 阅读 · 0 评论 -
C++57个入门知识点_25 new与delete(对于对象: new创建时先分配堆内存后调用构造函数,delete先调用析构,后释放堆空间;malloc和free只是堆内存操作,不会调用构造和析构)
1. 前面学习到:栈上的局部对象和全局对象,那对象是否可以建在堆上呢?当然是可以的!//栈上的对象:局部对象 //全局对象 //堆对象:对象分配在堆上利用C语言所学将对象建在堆上的方法如下://C语言中在堆上分配的10个字节,如何将对象分配到堆上呢?char* pBuf=(char*)malloc(10);//堆对象:将对象分配到堆上,但是并没有调用对象,但是对象需要初始化和析构CStudent* pStu = (CStudent*)malloc(sizeof(CStudent));但原创 2021-10-29 16:19:17 · 479 阅读 · 0 评论 -
C++57个入门知识点_24_ 浅拷贝与深拷贝(浅拷贝:对象1、2均指向一块内存; 深拷贝:重新分配内存,将对象1内容复制给对象2;何时重写拷贝构造函数:对象成员非基本数据类型,为资源时需重写或禁用)
1.什么是浅拷贝,深拷贝:浅拷贝://缺省的拷贝构造作用:1.完全把对象1拷贝给对象2;内存的拷贝(浅拷贝,对象1、2均指向一块内存)//浅拷贝在释放时会两次释放同一块内存,因此在第二次释放时由于内存已经释放过一次,因此会造成崩溃深拷贝://重新分配内存,将对象1的内容复制给对象2一张图看懂:2.何时需要重写拷贝构造函数:// 当类对象中的成员函数存在一种需要分配的资源时,为了避免在析构时重复释放,需要重写拷贝构造函数或禁用3.深拷贝构造函数的写法://通过引用的方式,将一个对象原创 2021-10-29 15:46:00 · 255 阅读 · 0 评论 -
C++57个入门知识点_23_ 拷贝构造函数(理解为copy构造;用一个对象创建另一个对象,调用的构造函数即拷贝构造函数;缺省为完全拷贝;手写即CStudent(CStudent& obj) {})
前面学习了构造与析构函数的概念,此处做一复习。构造函数: 编译器帮你在对象创建调用函数做初始化动作析构函数: 编译器在对象要死亡的时候帮你调用函数做资源的反初始化动作那什么是构造函数?带着这个疑问,我们来一步步拨开它神秘的面纱。1.利用一个对象创建另一个对象我们已经有了一个创建好的对象,将其赋值给新的对象。//将stu对象赋值给stu2 类似于int n=1;int k=n;CStudent stu2 = stu; #include <iostream>class CStu原创 2021-10-29 14:17:44 · 539 阅读 · 0 评论 -
C++57个入门知识点_22_ 构造函数和析构函数的调用时机(可手动调用构造和析构;访问权限一般为公有;局部对象声明时构造,出作用域析构;全局对象主函数前构造,出主函数后析构;全局对象实现主函数前后)
在C++中,构造函数和析构函数通常是公有访问权限针对构造函数和析构函数调用时机分为两种情况:1.函数是在栈上的,栈上的局部对象调用时机://函数是在栈上的,栈上的局部对象调用时机//构造-声明该对象时构造;//析构-对象出作用域时调用析构//例如main函数中,//块作用域{CStudent stu;}中,一出块作用域,对象stu就会被析构2.全局对象的调用时机(全局对象在哪都可能被使用,在运行完main之后才析构,来得早走得晚)://在执行main函数之前需要查看函数,可以采用全局对象的原创 2021-10-29 13:18:10 · 1114 阅读 · 0 评论