随笔分类 - C/C++基础
1
好几年前的笔记,整理出来
摘要:什么是虚继承 子类在继承父类时,在声明前加virtual关键字,这就是虚继承 例: class A { //...... } class B:virtual public A { //....... } 什么时候需要使用虚继承 在多重继承时,正常情况下子类对象将拥有继承链上所有父类对应的部分,但是如
阅读全文
摘要:单重继承-无虚函数 测试代码如下: class CBase { int m_nTest; public: CBase():m_nTest(0) { std::cout << "CBase()" << std::endl; } ~CBase() { std::cout << "~CBase()" <<
阅读全文
摘要:定义 函数覆盖 (1) 作用域不同 (2) 有virtual关键字 (3) 参数列表/返回值/调用约定必须相同 函数隐藏 (1) 作用域不同 (2) 函数名相同 (3) 参数列表/返回值/调用约定不考虑 函数重载 (1) 作用域相同 (2) 函数名相同 (3) 参数列表不同,返回值/调用约定不考 练
阅读全文
摘要:C++虚函数: 仅在定义父类成员函数的函数原型前加关键字virtual,子类如果重写了父类的虚函数那么子类前的virtual 关键字可写可不写,但是为了代码具有可读性,最好还是加上virtual关键字。 子类重写父类虚函数的条件: 子类的函数名称与父类的虚函数名称相同,参数列表也要相同,返回值也相同
阅读全文
摘要:C++继承与组合 继承与组合 继承和组合这两种方式得到的对象的内存结构是完全相同的,但是使用组合时要重写所包含类对象的部分成员函数 例如: 当使用组合时,要获取成员对象时如果不重写成员函数,就需要用 m_Cperson.GetSex()和m_Cperson.GetName来获取成员对象的信息 继承方
阅读全文
摘要:C++New和Delete new和delete 使用new创建对象,delete销毁对象 使用new创建一个动态类对象时,要执行三个步骤: a)调用名为operator new的标准库函数,分配足够大的内存。 b)调用该类的一个构造函数,创建对象 c)返回执向该对象的指针 使用delete删除时,
阅读全文
摘要:可重置和不可重载的运算符 运算符重载的本质:是一种特殊的函数重载,函数名称由关键字"operator"和后面的运算符组成 可重载的运算符 不可重载的运算符 必须重载为成员函数的运算符 不应该被重载的运算符 逻辑与(&&)逻辑或(||)的运算,据说会丢失短路属性; ","和"&"不要重载,因为C++对
阅读全文
摘要:this指针 当一个类对象(或者指向类对象的指针)调用成员函数时,编译器会生成额外的代码,将对象的首地址(this指针)隐式的传给被调用的成员函数,使得在成员函数的内部能够访问到类对象的数据成员. 下面举例观察下this在成员函数调用时传递过程: class CTest { int m_nNum;
阅读全文
摘要:内联函数 定义方式: 在函数原型前使用关键字inline即可,内联函数的声明和实现均要放在 头文件中。 使用内联函数目的: 避免比较简短的函数调用时的开销,在C语言中要想避免这一问题只能 通过宏函数来达到这一目的,但带参宏函数有一个缺点,那就是不能对参 数类型作检查,而C++提供的inline关键字
阅读全文
摘要:引用 引用就是为一个对象起另外一个名字 定义引用:在标识符前加上&,就表示定义了该变量是一个引用,例如: int nTest = 0; int & nrTest = nTest; 注意: 定义引用时要进行初始化,否则编译时会报错 对一个变量的引用赋值,等同于对这个变量赋值 虽然有多级指针,但是没有多
阅读全文
摘要:命名空间 在一个给定作用域中定义的标识符必须是唯一的,对于多人协作开发的庞大而复杂的程序中难免发生名称冲突,在C语言中并不能提供语法层面上的解决方案,只能依靠人为的命名规范,例如使用特殊的命名前缀来解决这一困境,但这样会导致变量名称过长,不利于程序员编写和阅读程序,但C++提供了语法层面的解决方案,
阅读全文
摘要:可变参函数指的是参数总个数不固定,只有调用时才知道到底有多少个参数 下面实现一个任意多个整数求和的可变参函数: int Sum(int nItemCount, ...) { int i = 0, sum = 0; va_list vp; va_start(vp, nItemCount); for (
阅读全文
摘要:使用条件宏进行条件编译 譬如,对于同一份代码,我想编译出两个不同的版本,在其中一个版本中去掉某一部分功能, 这时可以通过条件宏判断是否编译,例: 如果不使用条件宏进行控制,想编译两个不同版本的程序,就需要保存两份源代码。 条件编译的语法和if else语法类似,必须以#endif结尾例如: #if
阅读全文
摘要:使用声明的优先级规则解读声明 解读一个C语言声明,首先要找到声明中的标识符,然后按照优先级次序依次读取 优先级从高到低一次是: 声明中被括号括起来的部分 后缀操作符:()表示这是一个函数,[]表示这是一个数组 前缀操作符:*表示这是一个指针 const关键字后紧跟着类型描述符则说明该const关键字
阅读全文
摘要:C语言指针 C语言指针 1.指针与内存地址的区别: 指针是带有解释方式的内存地址,它不但指出了数据存放在何处,还指出了这个内存 地址存放的是什么类型的数据,而内存地址仅仅是个地址,至于数据是什么类型,数据 有多大,并没有解释。 2.指针访问和数组下标访问谁快谁慢: 使用指针访间接访问的程序运行速度要
阅读全文
摘要:C语言结构体 结构体的定义 结构体的定义要使用struct关键字,并以";"结尾。 下面找个微软定义的结构体: typedef struct _FILETIME { DWORD dwLowDateTime; DWORD dwHighDateTime; } FILETIME, *PFILETIME,
阅读全文
摘要:变量类型以及作用域和生命周期 变量的作用域 变量的作用域就该变量可以被访问的区间,变量的作用域可以分为以下四种: 进程作用域(全局):在当前进程的任何一个位置都可以访问 函数作用域:当流程转移到函数后,在其开始和结束的花括号内可访问 块作用域:最常见的就是if(...){...},while(..)
阅读全文
摘要:C语言函数调用详细过程 函数调用是步骤如下: 1. 按照调用约定传参 调用约定是调用方(Caller)和被调方(Callee)之间按相关标准 对函数的某些行为做出是商议,其中包括下面内容: 传参顺序:是从左往右传还是从右往左 传参方式:是用寄存器传还是使用内存传 平栈方式:是调用方平栈还是被调方平栈
阅读全文
摘要:C语言数组 1. 数组的定义 数组是用来存放数据类型相同且逻辑意义相同的数据 2. 数组的大小 数组的大小不能是变量,必须是常量或者常量表达式,常量表达式由编译器编译时自动求值。 也可以不指定数组大小,但必须对数组进行初始化,编译器在编译时会根据初始化列表中元 素的个数计算数组大小,例如: 3. 数
阅读全文
1

浙公网安备 33010602011771号