随笔分类 - C/C++
摘要:字节对齐:一个变量占用n个字节,则该变量的起始地址必须是n的整数倍,即存放起始地址%n=0;如果是结构体,那么结构体的起始地址是其最宽数据类型成员的整数倍;这个是cpu的要求,按照这样的存储方式,cpu查找起来会比较快,以空间来换取时间,提高程序的执行效率。 所以自己在写程序的时候,需要考虑字节对齐
阅读全文
摘要:强制类型转换是有一定风险的,有的转换并不一定安全,如把整型数值转换成指针,把基类指针抓换成派生类指针,把一种函数指针转换成另一种函数指针,把常量指针转换成非常量指针等。 C++引入四种功能不同的强制类型转换运算符以进行强制类型转换 const_cast static_cast reinterpret
阅读全文
摘要:面向对象设计,为什么? 变化是复用的天敌! 面向对象设计最大的优势在于:抵御变化 重新认识面向对象 理解隔离变化 从宏观层面来看,面向对象的构建方式更能适应软件的变化,能将变化所带来的影响减为最小 各司其职 从微观层面来看,面向对象的方式更强调各个类的“责任” 由于需求变化导致的新增类型不应该影响原
阅读全文
摘要:学习内容: 理解松耦合的设计思想 掌握面向对象设计原则 掌握重构技法改善设计 掌握GOF核心设计模式 什么是设计模式? “每一个模式描述了一个在我们周围不断重复发生的问题,以及该为题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动” 书籍:《设计模式:可复用面向对象软件的基础》
阅读全文
摘要:1 设计类,求圆的周长 2 内联函数 2.1 内联函数的引出 >函数宏的缺陷 2.1.1 必须保证运算完整性,加括号 2.1.2 即使加了括号,有些情况依然和你预期结果不符,比如++i 2.1.3 宏函数,也不重视作用域 2.2 内联函数,关键字:inline 2.3 函数声明和实现必须同时加上in
阅读全文
摘要:1 C++概述 1.1 C++两大编程思想 1.1.1 面向对象 泛型编程 1.2 C++98标准 2 C++书写hello world 2.1 包含头文件 #include <iostream> //标准输入输出头文件 2.2 using namespace std; //使用标准命名空间 2.3
阅读全文
摘要:RTTI:(Run-Time Type Identification,运行时类型识别) dynamic_cast 使用注意事项: (1)只能应用于指针和引用的转换 (2)要转换的类型中必须包含虚函数 (3)转换成功返回子类的地址,识别返回NULL typeid 使用注意事项 (1)typeid 返回
阅读全文
摘要:一个编译好的C语言可执行程序,内存分区: 程序运行时的内存分区:
阅读全文
摘要:在C语言中,编译分为4个步骤: .c文件 -> .i文件 -> .s文件 -> .o文件 -> 可执行文件 预处理 编译 汇编 链接 1.预处理: (1)头文件的展开 可通过命令 gcc -E hello.c -o hello.i 来进行查看预处理后的结果,其中 -E 表示对源文件hello.c只进
阅读全文
摘要:在C++ 98 中,auto 的作用是让变量成为自动变量(拥有自动的生命周期),但是该作用是多余的,变量默认拥有自动的生命周期,在C++ 11 中,已经删除了该用法,取而代之的作用是:自动推断变量的类型。 举例: int32_t a = 1; auto b = a; std::cout <<type
阅读全文
摘要:C++ 内存共分为5个区:栈区、堆区、全局区/静态区、代码区、字符常量区 (1)栈区 (2)堆区 (3)全局区/静态区 全局变量和静态全局变量的存储方式是一样的,区别在于,全局变量在整个源代码中都可以使用,而静态全局变量只能在当前文件中有效(对于全局变量,加上 static 只是改变了变量的作用范围
阅读全文
摘要:此时的输出结果是:Test::print 原因:此时虽然父类的 print 被隐藏了,但是 test 函数中 print 默认的作用域是Test::print,所以此时调用的是父类的。子类内存:父类 print (被隐藏了,但是地址还是在的),父类 test_print,子类 print 当加上 v
阅读全文
摘要:#include using namespace std; class Handler { private: int mMsg; Handler *mNextHandler; public: Handler(int msg) :mMsg(msg), mNextHandler(NULL) {} ~Handler() {} public: virtual...
阅读全文
摘要:#include using namespace std; template class Test { public: T1 m_t1; public: Test(T1 t1) { this->m_t1 = t1; } }; int main(void) { typedef Test TEST; int a(100); ...
阅读全文
摘要:volatile是类型修饰符,加上这个关键字,我们可以知道该变量可能被某些未知的因素更改(比如,操作系统,硬件或者其他线程等),但是我们不想它被修改,这个关键字可以防止编译器的优化,如下: volatile表明i是随时可能发生变化的,每次使用都必须从i的地址中进行取值,如果没有加volatile关键
阅读全文
摘要:我们自己定义的类,或者C++标准里默认提供的类,我们都可以看成是区别于基本数据类型(char,int,double等)的新类型,比如我们使用int类型时,一般会有如下的一些操作,如: (1)int a;//定义一个变量 (2)int a = 10;//定义一个变量并进行初始化操作 (3) int a
阅读全文
摘要:1.普通继承(不包含虚函数) a.单继承 b.多继承 c.菱形继承 C++对象模型:正在使用的在此模型下,nonstatic 数据成员被置于每一个类对象中,而static数据成员被置于类对象之外。static与nonstatic函数也都放在类对象之外,而对于virtual 函数,则通过虚函数表+虚指
阅读全文
摘要:unique_ptr的一些操作: unique_ptr使用场景: 1.为动态申请的资源提供异常安全保证 传统情况,可能会因为异常而没有走到delete部分,如下: 使用unique_ptr,只要unique_ptr指针创建成功,析构函数就一定会被调用,如下: 2.返回函数内动态申请资源的所有权 3.
阅读全文
摘要:在C++中,如果类的某个构造函数只有一个参数,那么编译器在编译的时候,就会有一个默认的隐式转换操作:将该构造函数参数的类型转换为该类的类型。 举例: 如上的Test test = 10操作是正确的,因为默认的隐式转换将构造函数参数的类型转换为当前类的类型,这样该构造函数就像拷贝构造函数一样,让Tes
阅读全文
摘要:如果别人将内敛函数写在.cpp源文件中,自己要调用的话,就需要将他所写的所有内敛函数拷贝到自己要用的源文件中,否则调用不了。
阅读全文