上一页 1 2 3 4 5 6 7 8 ··· 25 下一页
摘要: 【1】constexpr VS const const修饰的都是具有运行时常量性; constexpr修饰的都是具有编译时常量性; 假如你将一个成员函数标记为constexpr,则顺带也将它标记为了const。如果你将一个变量标记为constexpr,则同样它是const的。 但相反并不成立,一个c 阅读全文
posted @ 2020-02-01 01:12 kaizenly 阅读(853) 评论(0) 推荐(1) 编辑
摘要: 【1】C++11智能指针 (1)废弃auto_ptr auto_ptr应用示例: 1 auto_ptr<string> p1(new string("auto_ptr")); 2 auto_ptr<string> p2; 3 p2 = p1; // auto_ptr不会报错 此语句 p2 = p1; 阅读全文
posted @ 2020-01-31 22:32 kaizenly 阅读(289) 评论(0) 推荐(0) 编辑
摘要: 【1】枚举:分门别类与数值的名字 当程序中需要“数值的名字”时,通常有三种方式实现: (1)宏 1 #define Male (0) 2 #define Female (1) 缺点:如果代码中右Male或者Femal字符串,在预处理阶段一律替换,干扰正常代码。 (2)匿名的enum enum { M 阅读全文
posted @ 2020-01-31 18:36 kaizenly 阅读(1389) 评论(0) 推荐(0) 编辑
摘要: 【1】基于范围的for循环演化过程 (1)C++98传统写法 1 // C++98 传统写法 2 3 #include <iostream> 4 using namespace std; 5 6 int main() 7 { 8 int arr[5] = { 1, 2, 3, 4, 5 }; 9 1 阅读全文
posted @ 2020-01-31 17:25 kaizenly 阅读(393) 评论(0) 推荐(0) 编辑
摘要: 【1】追踪返回类型的引入 为什么要引入追踪返回类型? 在C++98中,如果一个函数模板的返回类型依赖于实际入口参数类型,那么该返回类型在模板实例化之前可能都无法确定。 还记得Sum模板函数吗?请看如下演化过程: 1 #include <iostream> 2 using namespace std; 阅读全文
posted @ 2020-01-31 16:09 kaizenly 阅读(741) 评论(0) 推荐(0) 编辑
摘要: 【1】typeid与decltype C++98对动态类型支持就是C++中的运行时类型识别(RTTI)。 (1)typeid RTTI的机制是为每个类型产生一个type_info类型的数据,可以在程序中使用typeid随时查询一个变量的类型,typeid就会返回变量相应的type_info数据。 t 阅读全文
posted @ 2020-01-30 23:18 kaizenly 阅读(601) 评论(0) 推荐(0) 编辑
摘要: 【1】静态类型、动态类型与类型推导 静态类型和动态类型的主要区别在于对变量进行类型检查的时间点: 静态类型,类型检查主要发生在编译阶段; 动态类型,类型检查主要发生在运行阶段。 类型推导示例如下: 1 int main() 2 { 3 double foo(); 4 auto x = foo(); 阅读全文
posted @ 2020-01-30 02:27 kaizenly 阅读(756) 评论(0) 推荐(0) 编辑
摘要: 【1】右尖括号>的改进 在C++98中,有一条需要规避的规则: 如果在实例化模板的时候出现了连续的两个右尖括号>,那么它们之间需要一个空格来进行分隔,以避免发生编译时的错误。示例如下: 1 // 示例1:嵌套的模板标识 2 template <int i> class X {}; 3 templat 阅读全文
posted @ 2020-01-30 02:00 kaizenly 阅读(603) 评论(0) 推荐(0) 编辑
摘要: 【1】using关键字 C++11标准规定了一种新的方法,使用关键字using作为别名声明来定义类型的别名,其后紧跟别名和等号。 作用是把等号左侧的名字规定成等号右侧类型的别名。 (1)using用法与typedef相同点 代码示例如下: 1 #include <iostream> 2 #inclu 阅读全文
posted @ 2020-01-30 01:32 kaizenly 阅读(812) 评论(0) 推荐(0) 编辑
摘要: 【1】为什么引入用户自定义字面量? 在C/C++程序中,常常会使用结构体或者类来创造新的类型,以满足实际的需求。 比如,在进行科学计算时,用户可能需要用到复数(通常会包含实部和虚部两部分)。 对于颜色,用户通常会需要一个四元组(三原色及Alpha)。 对于奥运会组委会,他们则常常会需要七元组(标示来 阅读全文
posted @ 2020-01-29 23:27 kaizenly 阅读(1788) 评论(0) 推荐(0) 编辑
摘要: 【1】受限联合体 一个联合体内,可以定义多种不同数据类型的成员,这些数据成员将会共享相同内存空间,在一些需要复用内存的情况下,可以达到节省空间的目的。 不过,根据C++98标准,并不是所有的数据类型都能够成为联合体的数据成员。如下代码: 1 struct Student 2 { 3 Student( 阅读全文
posted @ 2020-01-29 15:52 kaizenly 阅读(814) 评论(0) 推荐(0) 编辑
摘要: 【1】什么是POD类型? Plain old data structure,缩写为POD,Plain代表是一种普通类型,Old体现该类型的对象可以与C兼容。 POD类型是C++语言标准中定义的一类数据结构,适用于需要明确的数据底层操作的系统中。 POD通常被用在系统的边界处,即指不同系统之间只能以底 阅读全文
posted @ 2020-01-28 01:28 kaizenly 阅读(2855) 评论(0) 推荐(0) 编辑
摘要: 【1】显式转换操作符 C++11以前,对explicit关键字的理解可参考随笔《explicit关键字》。 而在C++11中,标准将explicit的使用范围扩展到了自定义类型转换操作符上,以支持所谓的“显式类型转换”。 explicit关键字作用于类型转换操作符上,意味着只有在直接 构造目标类型 阅读全文
posted @ 2020-01-27 22:48 kaizenly 阅读(483) 评论(0) 推荐(0) 编辑
摘要: 【1】为什么引入完美转发? 在函数模板编程中,常有一种场景是把模板参数转发给另一个调用函数,这时候如果只提供值传递版本会显得效率太低。看以下代码: 1 template<class TYPE, class ARG> 2 TYPE* getInstance(ARG arg) 3 { 4 TYPE* p 阅读全文
posted @ 2020-01-27 11:46 kaizenly 阅读(7052) 评论(0) 推荐(1) 编辑
摘要: 【1】std::move 在C++11中,标准库在<utility>中提供了一个有用的函数std::move。 这个函数的名字很具有迷惑性,因为实际上std::move并不能移动任何东西,它唯一的功能:将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。 从实现上讲,std: 阅读全文
posted @ 2020-01-27 00:18 kaizenly 阅读(1016) 评论(0) 推荐(0) 编辑
摘要: 【1】左值与右值 在C语言中,常常会提起左值(lvalue)、右值(rvalue)这样的称呼。 而在编译程序时,编译器有时也会在报出的错误信息中包含左值、右值的说法。 不过左值、右值通常不是通过一个严谨的定义而为人所知的。 事实上,之所以只知道一些关于左值、右值的判断而很少听到其真正的定义的一个原因 阅读全文
posted @ 2020-01-26 21:03 kaizenly 阅读(1474) 评论(0) 推荐(1) 编辑
摘要: 【1】为什么引入移动语义? 拷贝构造函数中为指针成员分配新的内存再进行内容拷贝的做法在C++编程中几乎被视为是最合理的。 不过在有些时候,我们会发现确实不需要这样的拷贝构造语义。如下示例: 1 #include <iostream> 2 using namespace std; 3 4 class 阅读全文
posted @ 2020-01-26 01:22 kaizenly 阅读(718) 评论(0) 推荐(0) 编辑
摘要: 【1】浅拷贝 一直以来,设计一个类,个人认为,最能体现水平的地方在于:类中含有指针成员变量。 如下一个典型的浅拷贝示例: 1 #include <iostream> 2 using namespace std; 3 4 class HasPtrMem 5 { 6 public: 7 HasPtrMe 阅读全文
posted @ 2020-01-25 23:09 kaizenly 阅读(4404) 评论(0) 推荐(0) 编辑
摘要: 【1】为什么需要委派构造函数? 委派构造函数,委派即委托安排,即委托安排其他构造函数代办构造对象的任务。 为什么需要委派构造函数?请先看如下代码片段(示例1): 1 class Info 2 { 3 public: 4 Info() : type(1), name('a') 5 { 6 InitRe 阅读全文
posted @ 2020-01-25 11:37 kaizenly 阅读(797) 评论(0) 推荐(0) 编辑
摘要: 【1】为什么需要继承构造函数? 首先,看看如下代码片段: 1 struct A 2 { 3 A(int i) 4 {} 5 }; 6 7 struct B : A 8 { 9 B(int i) : A(i) 10 {} 11 }; 在C++中非常常见:B派生于A,B在构造函数中调用A的构造函数,从而 阅读全文
posted @ 2020-01-24 16:03 kaizenly 阅读(1836) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 ··· 25 下一页
打赏