摘要:
1) 当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数; 2) 回调函数就相当于一个中断处理函数,由系统在符合你设定的条件时自动调用。为此,你需要做三 件事:1,声明;2,定义;3,设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为 一个参数,以便于系统调用; 3) 回调函数
阅读全文
posted @ 2021-07-20 23:37
超人不会灰啊
阅读(471)
推荐(0)
摘要:
1) 有时候类里面定义了很多int,char,struct等c语言里的那些类型的变量,我习惯在构造函数中将它们初 始化为0,但是一句句的写太麻烦,所以直接就memset(this, 0, sizeof *this);将整个对象的内存全部置 为0。对于这种情形可以很好的工作,但是下面几种情形是不可以这
阅读全文
posted @ 2021-07-20 23:36
超人不会灰啊
阅读(130)
推荐(0)
摘要:
程序运行过程入口点main函数,main()函数返回值类型必须是int,这样返回值才能传递给程序激活 者(如操作系统)表示程序正常退出。 main(int args, char **argv) 参数的传递。参数的处理,一般会调用getopt()函数处理,但实践 中,这仅仅是一部分,不会经常用到的技能
阅读全文
posted @ 2021-07-20 23:33
超人不会灰啊
阅读(127)
推荐(0)
摘要:
1) 为了阻止编译器默认生成拷贝构造函数和拷贝赋值函数,我们需要手动去重写这两个函数,某些情 况下,为了避免调用拷贝构造函数和拷贝赋值函数,我们需要将他们设置成private,防止被调用。 2) 类的成员函数和friend函数还是可以调用private函数,如果这个private函数只声明不定义,则
阅读全文
posted @ 2021-07-20 23:31
超人不会灰啊
阅读(346)
推荐(0)
摘要:
1) 将类定义为抽象基类或者将构造函数声明为private; 2) 不允许类外部创建类对象,只能在类内部创建对象
阅读全文
posted @ 2021-07-20 23:29
超人不会灰啊
阅读(268)
推荐(0)
摘要:
1) 构造函数,构造函数初始化对象,派生类必须知道基类函数干了什么,才能进行构造;当有虚函数 时,每一个类有一个虚表,每一个对象有一个虚表指针,虚表指针在构造函数中初始化; 2) 内联函数,内联函数表示在编译阶段进行函数体的替换操作,而虚函数意味着在运行期间进行类型确定,所以内联函数不能是虚函数;
阅读全文
posted @ 2021-07-20 23:27
超人不会灰啊
阅读(261)
推荐(0)
摘要:
1) 记录在成员初始化列表中的数据成员初始化操作会被放在构造函数的函数体内,并与成员的声明顺 序为顺序; 2) 如果一个成员并没有出现在成员初始化列表中,但它有一个默认构造函数,那么默认构造函数必须 被调用; 3) 如果class有虚表,那么它必须被设定初值; 4) 所有上一层的基类构造函数必须被调
阅读全文
posted @ 2021-07-20 23:22
超人不会灰啊
阅读(181)
推荐(0)
摘要:
1) 在派生类构造函数中,所有的虚基类及上一层基类的构造函数调用; 2) 对象的vptr被初始化; 3) 如果有成员初始化列表,将在构造函数体内扩展开来,这必须在vptr被设定之后才做; 4) 执行程序员所提供的代码;
阅读全文
posted @ 2021-07-20 23:21
超人不会灰啊
阅读(222)
推荐(1)
摘要:
1) 当初始化一个引用成员变量时; 2) 初始化一个const成员变量时; 3) 当调用一个基类的构造函数,而构造函数拥有一组参数时; 4) 当调用一个成员类的构造函数,而他拥有一组参数; 5) 编译器会一一操作初始化列表,以适当顺序在构造函数之内安插初始化操作,并且在任何显示用户 代码前。list
阅读全文
posted @ 2021-07-20 23:18
超人不会灰啊
阅读(235)
推荐(0)
摘要:
有三种情况会以一个对象的内容作为另一个对象的初值: 1) 对一个对象做显示的初始化操作,X xx = x; 2) 当对象被当做参数交给某个函数时; 3) 当函数传回一个类对象时; 1) 如果一个类没有拷贝构造函数,但是含有一个类类型的成员变量,该类型含有拷贝构造函数,此时 编译器会为该类合成一个拷贝
阅读全文
posted @ 2021-07-20 23:16
超人不会灰啊
阅读(144)
推荐(0)
摘要:
1) 如果一个类没有任何构造函数,但他含有一个成员对象,该成员对象含有默认构造函数,那么编译 器就为该类合成一个默认构造函数,因为不合成一个默认构造函数那么该成员对象的构造函数不能调 用; 2) 没有任何构造函数的类派生自一个带有默认构造函数的基类,那么需要为该派生类合成一个构造函 数,只有这样基类
阅读全文
posted @ 2021-07-20 23:12
超人不会灰啊
阅读(90)
推荐(0)
摘要:
1) 有时候我们会遇到这样一种情况,我们用对象a初始化对象b后对象a我们就不在使用了,但是对象a 的空间还在呀(在析构之前),既然拷贝构造函数,实际上就是把a对象的内容复制一份到b中,那么为 什么我们不能直接使用a的空间呢?这样就避免了新的空间的分配,大大降低了构造的成本。这就是移 动构造函数设计的
阅读全文
posted @ 2021-07-20 23:09
超人不会灰啊
阅读(84)
推荐(0)
摘要:
1) 类的非静态成员变量大小,静态成员不占据类的空间,成员函数也不占据类的空间大小; 2) 内存对齐另外分配的空间大小,类内的数据也是需要进行内存对齐操作的; 3) 虚函数的话,会在类对象插入vptr指针,加上指针大小; 4) 当该该类是某类的派生类,那么派生类继承的基类部分的数据成员也会存在在派生
阅读全文
posted @ 2021-07-20 23:00
超人不会灰啊
阅读(170)
推荐(0)
摘要:
1) 对象的静态类型:对象在声明时采用的类型。是在编译期确定的。 2) 对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态 类型无法更改。 3) 静态绑定:绑定的是对象的静态类型,某特性(比如函数依赖于对象的静态类型,发生在编译期。 4) 动态绑定:绑定的是对象的
阅读全文
posted @ 2021-07-20 22:59
超人不会灰啊
阅读(232)
推荐(0)
摘要:
当在类的非静态成员函数访问类的非静态成员时,编译器会自动将对象的地址传给作为隐含参数传递给函数,这个隐含参数就是this指针。 即使你并没有写this指针,编译器在链接时也会加上this的,对各成员的访问都是通过this的。 例如你建立了类的多个对象时,在调用类的成员函数时,你并不知道具体是哪个对象
阅读全文
posted @ 2021-07-20 22:53
超人不会灰啊
阅读(290)
推荐(0)
摘要:
1、static成员不属于任何类对象或类实例,所以即使给此函数加上virutal也是没有任何意义的。 2、静态与非静态成员函数之间有一个主要的区别,那就是静态成员函数没有this指针。 虚函数依靠vptr和vtable来处理。vptr是一个指针,在类的构造函数中创建生成,并且只能用this指针来 访
阅读全文
posted @ 2021-07-20 22:48
超人不会灰啊
阅读(364)
推荐(0)
摘要:
1) 使用引用参数的主要原因有两个: 程序员能修改调用函数中的数据对象 通过传递引用而不是整个数据–对象,可以提高程序的运行速度 2) 一般的原则: 对于使用引用的值而不做修改的函数: 如果数据对象很小,如内置数据类型或者小型结构,则按照值传递; 如果数据对象是数组,则使用指针(唯一的选择),并且指
阅读全文
posted @ 2021-07-20 22:47
超人不会灰啊
阅读(202)
推荐(0)
摘要:
1) C++空类的大小不为0,不同编译器设置不一样,vs设置为1; 2) C++标准指出,不允许一个对象(当然包括类对象)的大小为0,不同的对象不能具有相同的地址; 3) 带有虚函数的C++类大小不为1,因为每一个对象会有一个vptr指向虚函数表,具体大小根据指针大小确定; 4) C++中要求对于类
阅读全文
posted @ 2021-07-20 22:43
超人不会灰啊
阅读(195)
推荐(0)
摘要:
1) 拷贝构造函数的作用就是用来复制对象的,在使用这个对象的实例来初始化这个对象的一个新的实 例。 2) 参数传递过程到底发生了什么? 将地址传递和值传递统一起来,归根结底还是传递的是"值"(地址也是值,只不过通过它可以找到另一 个值)! i)值传递: 对于内置数据类型的传递时,直接赋值拷贝给形参(
阅读全文
posted @ 2021-07-20 22:37
超人不会灰啊
阅读(421)
推荐(0)
摘要:
1) string 是c++标准库里面其中一个,封装了对字符串的操作,实际操作过程我们可以用const char*给 string类初始化 a) string转const char*string s = “abc”;const char* c_s = s.c_str();b) const char*
阅读全文
posted @ 2021-07-20 22:16
超人不会灰啊
阅读(454)
推荐(0)
摘要:
1) C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的、独立的、不属于任何类的函数组成的。函数库继承自 C 语言。 面向对象类库: 这个库是类及其相关函数的集合。 2) 输入/输出 I/O、字符串和字符处理、数学、时间、日期和本地化、动态分配、其他、宽字符函数 3) 标准的 C++ I
阅读全文
posted @ 2021-07-20 22:11
超人不会灰啊
阅读(244)
推荐(0)
摘要:
volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比 如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再 进行优化,从而可以提供对特殊地址的稳定访问。声明时语法:int volatile vInt; 当要求使用 v
阅读全文
posted @ 2021-07-20 22:08
超人不会灰啊
阅读(67)
推荐(0)
摘要:
数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //
阅读全文
posted @ 2021-07-20 22:02
超人不会灰啊
阅读(95)
推荐(0)
摘要:
参数的含义是程序在命令行下运行的时候,需要输入argc 个参数,每个参数是以char 类型输入的,依 次存在数组里面,数组是 argv[],所有的参数在指针 char * 指向的内存中,数组的中元素的个数为 argc 个,第一个参数为程序的名称。
阅读全文
posted @ 2021-07-20 22:00
超人不会灰啊
阅读(140)
推荐(0)
摘要:
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。 2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。 3、用途不同。通常在复制字符串
阅读全文
posted @ 2021-07-20 21:52
超人不会灰啊
阅读(179)
推荐(0)
摘要:
1、在类对象的内存空间中,只有数据成员和虚函数表指针,并不包含代码内容,类的成员函数单独放 在代码段中。在调用成员函数时,隐含传递一个this指针,让成员函数知道当前是哪个对象在调用它。 当调用delete this时,类对象的内存空间被释放。在delete this之后进行的其他任何函数调用,只要
阅读全文
posted @ 2021-07-20 21:49
超人不会灰啊
阅读(206)
推荐(0)
摘要:
因为在编译时模板并不能生成真正的二进制代码,而是在编译调用模板类或函数的CPP文件时才会去找 对应的模板声明和实现,在这种情况下编译器是不知道实现模板类或函数的CPP文件的存在,所以它只 能找到模板类或函数的声明而找不到实现,而只好创建一个符号寄希望于链接程序找地址。 但模板类或函数的实现并不能被编
阅读全文
posted @ 2021-07-20 21:38
超人不会灰啊
阅读(308)
推荐(0)
摘要:
1) 前置返回一个引用,后置返回一个对象 2) 前置不会产生临时对象,后置必须产生临时对象,临时对象会导致效率降低
阅读全文
posted @ 2021-07-20 00:48
超人不会灰啊
阅读(169)
推荐(0)
摘要:
1) C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承。 2) 多重继承的优点很明显,就是对象可以调用多个基类中的接口; 3) 如果派生类所继承的多个基类有相同的基类,而派生类对象需要调用这个祖先类的接口方法,就会容 易出现二义性 4) 加上全局符确定调用哪一份拷贝。比如pa.Aut
阅读全文
posted @ 2021-07-20 00:40
超人不会灰啊
阅读(338)
推荐(0)
摘要:
菱形继承的定义是:两个子类继承同一父类,而又有子类同时继承这两个子类。例如a,b两个类同时继 承c,但是又有一个d类同时继承a,b类。
阅读全文
posted @ 2021-07-20 00:38
超人不会灰啊
阅读(110)
推荐(0)
摘要:
1、C++的基本类型中并非完全的对立,部分数据类型之间是可以进行隐式转换的。所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为。很多时候用户可能都不知道进行了哪些转换 2、C++面向对象的多态特性,就是通过父类的类型实现对子类的封装。通过隐式转换,你可以直接将 一个子类的对象使用父类的类
阅读全文
posted @ 2021-07-20 00:36
超人不会灰啊
阅读(416)
推荐(0)
摘要:
1) 一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才 进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一 组语句进行编译,而当条件不满足时则编译另一组语句。 2) 条件编译命令最常见的形式为: \#ifdef 标识符
阅读全文
posted @ 2021-07-20 00:29
超人不会灰啊
阅读(411)
推荐(0)
摘要:
1) 生命周期 静态成员变量从类被加载开始到类被卸载,一直存在; 普通成员变量只有在类创建对象后才开始存在,对象结束,它的生命期结束; 2) 共享方式 静态成员变量是全类共享;普通成员变量是每个对象单独享用的; 3) 定义位置 普通成员变量存储在栈或堆中,而静态成员变量存储在静态全局区; 4) 初始
阅读全文
posted @ 2021-07-20 00:22
超人不会灰啊
阅读(406)
推荐(1)
摘要:
1、全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。 全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程 序由多个原文件组成时,非静态的全局变量在各个源文件中都是有效的。
阅读全文
posted @ 2021-07-20 00:00
超人不会灰啊
阅读(751)
推荐(0)