c++深度剖析
小虾米_2018
专注于C、C++、嵌入式系统、网络、驱动编程~
展开
-
C++深度解析(1)—C到 C++ 的升级
1.C与C++的关系C++继承了所有的C特性 C++在C的基础上提供了更多的语法和特性 C++的设计目标是运行效率与开发效率的统一2.C到C++的升级2.1 C++更强调语言的实用性,所有的变量都可以在需要时候再定义intc = 0;for(inti = 0; i <= 3; i++){for(intj = 1; j <= ...原创 2019-07-17 19:23:28 · 502 阅读 · 3 评论 -
C++深度解析(2)—C/C++中的const分析
1.C语言中的const1.1const只读变量const修饰的变量是只读的,本质还是变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在全局数据区分配空间 const只在编译期有用,在运行期无用 const修饰的变量不是真的变量,它只是告诉编译器该变量不能出现在赋值符号的左边1.2 const全局变量的分歧在现代C语言编译器中,修改const全局变量将...原创 2019-07-17 19:23:37 · 449 阅读 · 0 评论 -
C++深度解析(3)—布尔类型和引用
1.布尔类型1.1 布尔类型C++中的布尔类型 C++在C语言的基本类型系统之上增加了bool C++中的bool可取的值只有true和false 理论上bool只占用一个字节 true代表真值,编译器内部用1来表示 false代表非真值,编译器内部用0来表示 1.2 布尔类型的值bool类型只有true(非0)和false(0)两个值 C++编译器会将非0值转换...原创 2019-07-17 19:23:45 · 1854 阅读 · 0 评论 -
C++深度解析(4)—内联函数
1.常量与宏回顾C++中的const常量可以替代宏常数定义,如: const int A= 3; ←→ #define A 3 C++中是否有解决方案替代宏代码片段呢?2.内联函数C++中推荐使用内联函数替代宏代码片段 C++中使用inline关键字声明内联函数inlineintfunc(inta,intb){returna<b?...原创 2019-07-17 19:23:54 · 469 阅读 · 0 评论 -
C++深度解析(5)—函数参数的扩展
1.函数参数的默认值C++中可以在函数声明时为参数提供—个默认值 当函数调用时没有提供参数的值,则使用默认值#include <stdio.h>int mul(int x = 3);int main(int argc, char *argv[]){ printf("mul(2) = %d\n", mul(2)); // 4 printf("mul(...原创 2019-07-17 19:24:08 · 227 阅读 · 0 评论 -
C++深度解析(6)—函数重载分析,C/C++代码相互调用
1.C++中的函数重载重载:同一标志符在不同的上下文有不同的意义 函数重载(Function Overload) :用同—个函数名定义不同的函数 当函数名和不同的参数搭配时函数的含义不同 函数重载至少满足下面的一个条件: 参数个数不同 参数类型不同 参数顺序不同 #include <stdio.h> #inclu...原创 2019-07-17 19:24:15 · 355 阅读 · 0 评论 -
C++深度解析(7)—C++中的新成员new和namespace
1.动态内存分配C++中的动态内存分配 C++中通过new关键字进行动态内存申请 C++中的动态内存申请是基于类型进行的 delete关键字用于内存释放C通过库函数完成动态内存分配,在一些硬件平台开发,可能失败#include <stdio.h> int main() { int* p = new int; ...原创 2019-07-17 19:24:22 · 507 阅读 · 0 评论 -
C++深度解析(8)—C++新型的类型转换
1.强制类型转换C方式的强制类型转换 (Type) (Expression) Type (Expression) #include <stdio.h> typedef void(PF)(int); struct Point { int x; int y; }; int main() { ...原创 2019-07-17 19:24:30 · 216 阅读 · 0 评论 -
C++深度解析(9)—进阶面向对象
1.面向对象基本概念面向对象的意义在于 将日常生活中习惯的思维方式引入程序设计中 将需求中的概念直观的映射到解决方案中 以模块为中心构建可复用的软件系统 提高软件产品的可维护性和可扩展性 类和对象是面向对象中的两个基本概念 类:指的是一类事物,是一个抽象的概念 对象:指的是属于某个类的具体实体 类是一种模型,这种模型可以创建出不同的对象实体 ...原创 2019-07-18 10:08:44 · 220 阅读 · 0 评论 -
C++深度解析(10)—类与封装的概念,class的引入
1.类与封装的概念1.1 类的组合电脑—般而言是由CPU, 内存,主 板,键盘和硬盘等部件组合而成。1.2 思考学习电脑组装需要多少时间? 学习电脑组装是否需要学习显示器,键盘, 鼠标,主板,内存等部件的设计与制造?1.3 类的封装类通常分为以下两个部分 类的实现细节 类的使用方式 当使用类时,不需要关心其实现细节 当创建类时,才需要考虑其内...原创 2019-07-18 10:08:54 · 362 阅读 · 0 评论 -
C++深度解析(11)—对象的初始化、浅拷贝、深拷贝、数组类的创建
1.对象的构造(上)1.1 问题对象中成员变量的初始值是多少?#include <stdio.h>class Test{private: int i; int j;public: int getI() { return i; } int getJ() { return j; } };Test gt; // 静态存储区int...原创 2019-07-18 14:34:12 · 631 阅读 · 0 评论 -
C++深度解析(12)—初始化列表的使用、类中的const成员、const对象
1.C++中的对象组合C++中的类可以使用其它类定义成员变量,如何给对象成员进行初始化? C++中提供了初始化列表对成员变量进行初始化//语法规则ClassName::ClassName():ml(vl),m2(vl,v2),m3(v3){//someotherinitializeoperation} 注意事项 成员的初始化顺序与...原创 2019-07-18 15:37:52 · 877 阅读 · 0 评论 -
C++深度解析(13)—局部、全局、堆对象的构造顺序
1.问题C++中的类可以定义多个对象,那么对象构造的顺序是怎样的? 局部对象的构造顺序依赖于程序的执行流 堆对象的构造顺序依赖于new的使用顺序 全局对象的构造顺序是不确定的 1.1局部对象的构造顺序对于局部对象:当程序执行流到达对象的定义语句时进行构造#include <stdio.h>class Test{private: int m...原创 2019-07-18 16:36:41 · 351 阅读 · 0 评论 -
C++深度解析(14)—对象的销毁
1.对象的销毁一般而言,需要销毁的对象都应该做清理 解决方案: 为每个类都提供—个public的free函数 对象不再需要时立即调用free函数进行清理 classTest{int*p;public:Test(){p=newint;} voidfr...原创 2019-07-18 20:19:50 · 670 阅读 · 0 评论 -
C++深度解析(15)—神秘的临时对象
1.有趣的问题有趣的问题#include <stdio.h>class Test { int mi; public: Test(int i) { mi = i; } Test() { Test(0); } void print() { printf("mi = %d\n", mi); } }; ...原创 2019-07-18 21:48:03 · 222 阅读 · 1 评论 -
C++深度解析(16)—类的静态成员
1.类成员的回顾从面向对象的角度 对象由属性(成员变量)和方法(成员函数)构成 从程序运行的角度 对象由数据和函数构成 数据可以位于栈,堆和全局数据区 函数只能位于代码段 结论 通过对象名能够访问public成员变量 每个对象都可以有只属于自己的成员变量 成员变量不能在对象之间共享 2.新的需求统计在程序运行期间某个类的对象数目 保...原创 2019-07-19 09:44:49 · 250 阅读 · 0 评论 -
C++深度解析(17)—二阶构造模式
1.构造函数的回顾类的构造函数用于对象的初始化 构造函数与类同名并且没有返回值 构造函数在对象定义时自动被调用2.面试题1. 如何判断构造函数的执行结果? 没有办法直接判断构造函数的执行结果。 2. 在构造函数中执行return语句会发生什么? return语句执行后,构造函数立即返回(return前面初始化成功,后面为随机值)。 3. 构造函数执行结束是否...原创 2019-07-19 14:56:04 · 220 阅读 · 0 评论 -
C++深度解析(18)—友元的尴尬能力
1.概念友元是C++中的一种关系,友元关系发生在函数与类之间或者类与类之间。友元关系是单项的,不能传递。2.友元的用法在类中以friend关键字声明友元 类的友元可以是其它类或者具体函数 友元不是类的—部分 友元不受类中访问级别的限制 友元可以直接访问具体类的所有成员3.友元的语法在类中用friend关键字对函数或类进行声明classPoint{...原创 2019-07-19 14:56:15 · 200 阅读 · 0 评论 -
C++深度解析(19)—类中的函数重载
1.函数重载回顾函数重载的本质为相互独立的不同函数 C++中通过函数名和函数参数确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同—个作用域中2.类中的重载类中的成员函数可以进行重载 构造函数的重载 普通成员函数的重载 静态成员函数的重载 问题:全局函数,普通成员函数以及静态成员函数之间是否可以构成重载?3.万变不离...原创 2019-07-19 16:14:43 · 316 阅读 · 0 评论 -
C++深度解析(20)—操作符重载的概念
1.需要解决的问题下面的复数解决方案是否可行?#include<stdio.h>class Complex { int a; int b;public: Complex(int a = 0, int b = 0) { //构造函数 this->a = a; this->b = b; } int getA() { re...原创 2019-07-19 19:21:11 · 171 阅读 · 0 评论 -
C++深度解析(21)—完善的复数类
1.特性复数类应该具有的操作 运算:+,-,*,/ 比较:==,!= 赋值:= 求模:modulus 利用操作符重载 统一复数与实数的运算方式 统一复数与实数的比较方式 Complexoperator+(constComplex &c);Complexoperator-(constComplex &c);Complexo...原创 2019-07-19 19:49:16 · 400 阅读 · 0 评论 -
C++深度解析(22)—初探C++标准库
1.有趣的重载操作符<<的原生意义是按位左移,例:1 << 2 ; 其意义是将整数1按位左移2位,即:0000 0001 → 0000 01002.编程实验重载左移操作符 #include<stdio.h>const char endl = '\n';class Console {public: Cons...原创 2019-07-19 20:55:58 · 331 阅读 · 0 评论 -
C++深度解析(23)—C++中的字符串
1.历史遗留问题C语言不支持真正意义上的字符串 C语言用字符数组和一组函数实现字符串操作 C语言不支持自定义类型,因此无法获得字符串类型2.解决方案从C到C++的进化过程引入了自定义类型,在C++中可以通过类完成字符串类型的定义 问题:C++中的原生类型系统是否包含字符串类型?3.标准库中的字符串类C++语言直接支持C语言的所有概念 C++语言中没有原生的字符串...原创 2019-07-20 16:06:12 · 593 阅读 · 0 评论 -
C++深度解析(24)—数组操作符的重载、数组类的改进
1.字符串类的兼容性string类最大限度地考虑了C字符串的兼容性,可以按照使用C字符串的方式使用string对象。string s = "a1b2c3d4e";int n = 0;for(int i = 0;i < s.length();i++){ if(isdigit(s[i])){ n++; }}编程实验:用C方式使用string类...原创 2019-07-20 16:06:21 · 205 阅读 · 0 评论 -
C++深度解析(25)—函数对象分析(函数调用操作符的重载)
1、客户需求编写—个函数 函数可以获得斐波那契数列每项的值 每调用—次返回—个值 函数可根据需要重复使用2.编程实验第—个解决方案#include <iostream>using namespace std; //1 1 2 3 5 8 ...int fib() { static int a0 = 0; //可以换成全局变量 ...原创 2019-07-20 17:35:10 · 267 阅读 · 0 评论 -
C++深度解析(26)—赋值运算符与拷贝构造函数
1.关于赋值运算符与拷贝构造函数编译器为每个类默认重载了赋值操作符 默认的赋值操作符仅完成浅拷贝 当需要进行深拷贝时必须重载赋值操作符 赋值操作符与拷贝构造函数有相同的存在意义//对于class Test{};等价于下列写法class Test{public: Test();//const Test t1; 构造函数 Test(const Test &a...原创 2019-07-21 11:07:52 · 303 阅读 · 0 评论 -
C++深度解析(27)—智能指针分析
1.永恒的话题内存泄漏(臭名昭著的Bug) 动态申请堆空间,用完后不归还 C++语言中没有垃圾回收的机制 指针无法控制所指堆空间的生命周 2.编程实验内存泄漏 #include<iostream>#include<string>using namespace std;class Test { int i;public:...原创 2019-07-21 16:28:16 · 217 阅读 · 0 评论 -
C++深度解析(28)—逻辑操作符的陷阱
1.潜规则逻辑运算符的原生语义 操作数只有两种值(true和false) 逻辑表达式不用完全计算就能确定最终值 最终结果只能是true或者false 2.编程实验逻辑表达式 #include<iostream>#include<string>using namespace std;int func(int i) { cou...原创 2019-07-21 17:12:32 · 176 阅读 · 0 评论 -
C++深度解析(29)—逗号操作符的分析
1.逗号操作符逗号表达式用于将多个子表达式连接为一个表达式 逗号表达式的值为最后一个子表达式的值 逗号表达式的前N-1个子表达式可以没有返回值 逗号表达式按照从左向右的顺序 计算每个子表达式的值exp1,exp2,exp3,…,expN;#include<iostream>#include<string>using namespace std;void...原创 2019-07-21 19:13:01 · 316 阅读 · 0 评论 -
C++深度解析(30)—前置操作符和后置操作符
1.思考下面代码的区别?为什么?i++; // i的值作为返回值,i自增1++i; // i自增1,i的值作为返回值2.编程实验真的有区别吗?#include<iostream>using namespace std;int main(){ int i = 0; i++; ++i; return 0;}结果:通过实际调试...原创 2019-07-21 21:23:09 · 588 阅读 · 0 评论 -
C++深度解析(31)— 转换构造函数
1.再论类型转换标准数据类型之间会进行隐式的类型安全转换 转换规则如下:从左往右每个类型大小依次递增。当出现不同类型之间运算时,编译器会进行隐式类型转换。#include<iostream>using namespace std;int main() { short s = 'a'; // char -> short 一个字节转换为两个...原创 2019-07-22 12:36:24 · 1138 阅读 · 0 评论 -
C++深度解析(32)— 类型转换函数
1.问题类类型是否能够转换到普通类型?2.类型转换函数C++类中可以定义类型转换函数 类型转换函数用于将类对象转换为其它类型 语法规则:operatorType(){Typeret;//...returnret;}3.编程实验类型转换函数初探 #include ...原创 2019-07-22 15:09:27 · 245 阅读 · 0 评论 -
C++深度解析(33)—继承的概念和意义
1.类之间的关联关系组合关系:整体与部分的关系 继承关系:父子关系2.组合与继承关系关系的特点组合关系的特点 将其它类的对象作为当前类的成员使用 当前类的对象与成员对象的生命期相同 成员对象在用法上与普通对象完全一致 继承指类之间的父子关系 子类拥有父类的所有属性(成员变量)和行为(成员方法) 子类就是一种特殊的父类 子类对象可以当作父类对象使用 ...原创 2019-07-22 16:17:52 · 235 阅读 · 0 评论 -
C++深度解析(34)—继承中的访问级别
1.值得思考的问题子类是否可以直接访问父类的私有成员? 根据面向对象的理论:子类拥有父类的一切属性和行为,子类能够直接访问父类的私有成员! 但C++语法规定,外界不能直接访问类的private成员,所以子类也不能直接访问父类的私有成员! #include <iostream>#include <string>using namespace std;...原创 2019-07-22 17:10:16 · 211 阅读 · 0 评论 -
C++深度解析(35)—不同的继承方式
1.C++中3种不同的继承方式public继承:父类成员在子类中保持原有访问级别 private继承:父类成员在子类中变为私有成员 protected继承:父类中的公有成员变为保护成员(只有子类可以访问,父类不能访问),其它成员保持不变。C++中的默认继承方式为:private2.编程实验——继承与访问级别深度实践#include<iostream>using...原创 2019-07-22 18:16:11 · 225 阅读 · 1 评论 -
C++深度解析(36)-继承中的构造与析构
1.子类对象的构造子类中可以定义构造函数 子类构造函数,必须对继承而来的成员进行初始化,有两种方式 调用父类构造函数进行初始化 直接通过初始化列表进行初始化或赋值的方式进行初始化 父类构造函数在子类中调用方式 默认调用:适用于无参构造函数和使用默认参数的构造函数 显式调用:通过初始化列表进行调用,适用于所有父类构造函数 class Child : public Par...原创 2019-07-22 20:54:33 · 181 阅读 · 0 评论 -
C++深度解析(37)—父子间的冲突
1.思考子类中是否可以定义父类中的同名成员?如果可以,如何区分?如果不可以,为什么? 编程实验:#include <iostream>using namespace std;class Parent {public: int mi;};class Child : public Parent {public: int mi;};int main(...原创 2019-07-22 21:38:35 · 156 阅读 · 0 评论 -
C++深度解析(38)—同名覆盖引发的问题
1.父子间的赋值兼容(子类对象可以当作父类对象使用(兼容性))子类对象可以直接赋值给父类对象 子类对象可以直接初始化父类对象 父类指针可以直接指向子类对象 父类引用可以直接引用子类对象#include<iostream>using namespace std;class Parent {public: int mi; void add(int i) ...原创 2019-07-22 22:25:06 · 213 阅读 · 0 评论 -
C++深度解析(39)—多态的概念和意义
1.函数重写回顾父类中被重写的函数依然会继承给子类 子类中重写的函数将覆盖父类中的函数 通过作用域分辨符(::)可以访问到父类中的函数Childc;Parent*p=&c;c.Parent::print();// 从父类中继承c.print()// 在子类中重写,如果不能使用多态,那么重写无意义。p->print();...原创 2019-07-23 15:05:37 · 195 阅读 · 0 评论 -
C++深度解析(40)—C++对象模型分析(上)
1.回归本质class是一种特殊的结构体 在内存中class依旧可以看作变量的集合 class与struct遵循相同的内存对齐规则 class中的成员函数与成员变量是分开存放的。即每个对象有独立的成员变量,但所有对象共享类中的成员函数。 编程实验——对象内存布局初探#include<iostream>using namespace std;class ...原创 2019-07-23 16:37:40 · 195 阅读 · 1 评论