随笔分类 -  C/C++

摘要:普通类的成员函数模板 不管是普通类还是类模板,它的成员函数可以是一个函数模板(成为成员函数模板)。不可以是虚函数,否则编译器会报错。 //普通类的成员函数模板 class A { public: template<typename T> void my_ft(T tmp) //成员函数模板 { co 阅读全文
posted @ 2020-11-28 15:07 NaughtyCoder 阅读(430) 评论(0) 推荐(0)
摘要:typename的使用场合 模板定义中,表明其后的模板参数是类型参数 template<typename T, int a, int b> //typename后跟的是一个类型 int funcadd(T c){...} template<typename T> //typename可以写为clas 阅读全文
posted @ 2020-11-28 15:02 NaughtyCoder 阅读(129) 评论(0) 推荐(0)
摘要:auto类型常规推断 C++11中,auto用于自动类型推断,在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,不需要程序员显示指定类型; auto自动类型推断发生在编译器期间,所以不会影响程序执行期间的性能; auto定义变量必须立即初始化;这样编译器才能推断它的实际类型;编译的时候 阅读全文
posted @ 2020-08-08 12:07 NaughtyCoder 阅读(955) 评论(0) 推荐(1)
摘要:decltype 用于推导类型,对于一个给定的变量或者表达式,使用decltype可以得到其类型; decltype的自动类型推断会发生在编译阶段和auto一样 decltype不会直接计算表达式的值 变量 #include <iostream> #include <string> #include 阅读全文
posted @ 2020-08-06 11:01 NaughtyCoder 阅读(1031) 评论(0) 推荐(1)
摘要:引用折叠规则 引用折叠 C++11新标准 C++中有明确含义的引用只有两种,一种是&左值引用类型,一种是带&&右值引用类型; 折叠规则:如果任意一个引用为左值引用,那么结果就为左值引用,否则就是右值引用 一共下面四种情况 & & & && && & && && #include <iostream> 阅读全文
posted @ 2020-08-06 10:59 NaughtyCoder 阅读(610) 评论(0) 推荐(1)
摘要:查看类型推断结果 需要清楚编译器推断出来的模板参数以及普通参数类型是什么; 通过查看编译器类型推断的结果;掌握C++类型推断的规则; 借助boost库:利用boost库来把编译器推断的类型信息打印出来;官网:www.boost.org 模板类型推断 #include <iostream> #incl 阅读全文
posted @ 2020-08-06 10:57 NaughtyCoder 阅读(460) 评论(0) 推荐(0)
摘要:类型区别基本概念 #include <iostream> using namespace std; template <typename T> void func(const T &val){} //T是什么类型; //val是什么类型; int main() { func(10); //T是什么类 阅读全文
posted @ 2020-08-06 10:56 NaughtyCoder 阅读(458) 评论(0) 推荐(0)
摘要:总述 ()圆括号是函数调用的明显标记,()也叫函数调用运算符; 如果在类中重载了函数调用运算符,就可以想使用函数一样使用该类的对象了; 只要对象所属的类重载了()函数调用运算符,那么这个类对象就变成了可调用的;而且可以调用多个版本的(),只要在参数类型或者数量上有差别即可; 重载了()的类实例化的对 阅读全文
posted @ 2020-08-06 10:55 NaughtyCoder 阅读(308) 评论(0) 推荐(0)
摘要:用法简介 一种可调用对象,定义了一个匿名函数,并且可以捕获一定范围内的变量; auto f = [](int a)->int{return a + 1}; cout << f(1) << endl; 特点 匿名函数,也可以理解为可调用的代码单元;或者理解成未命名的内联函数; 有一个返回类型,一个参数 阅读全文
posted @ 2020-08-04 20:22 NaughtyCoder 阅读(203) 评论(0) 推荐(0)
摘要:可调用对象 函数指针 void myfunc(int tv) { cout << tv << endl; } int main() { void (*func)(int) = myfunc; //定义函数指针并赋值; func(10); //调用函数,可调用对象; } 仿函数 具有operator( 阅读全文
posted @ 2020-08-04 20:21 NaughtyCoder 阅读(276) 评论(0) 推荐(0)
摘要:手撕String,面试中经常会问到,今天我们自己实现并梳理MyString类,同时加深对拷贝构造,移动构造;运算符重载的理解; 成员变量 字符串MyString类中两个成员变量 char *的字符串m_data; 保存字符串大小的m_size; 构造函数和析构函数 MyString(const ch 阅读全文
posted @ 2020-08-04 10:16 NaughtyCoder 阅读(417) 评论(0) 推荐(0)
摘要:memcpy #include <iostream> #include <string.h> #include <assert.h> using namespace std; void* my_memcpy(void* dst, const void* src, size_t size) { ass 阅读全文
posted @ 2020-08-03 22:07 NaughtyCoder 阅读(167) 评论(0) 推荐(0)
摘要:概述 用类模板实例化一个特定的类; 编译器不能为类模板推断模板参数,为了使用类模板,必须在模板名后用<>来提供额外的信息; 同一套代码,可以应付不同的数据类型; 类模板定义 格式 template <typename T, ...> class name { } 实例化类模板的时候,必须要有类的全部 阅读全文
posted @ 2020-08-03 10:12 NaughtyCoder 阅读(135) 评论(0) 推荐(0)
摘要:概述 泛型编程,是以独立于任何特定类型的方式编写代码,使用泛型编程时,需要提供具体程序实例所操作的类习惯或者值; 模板是泛型编程的基础,模板是创建类或者函数的蓝图或者公式,给这些蓝图或者公式足够的信息,让这些蓝图或者公式真正的转变为具体的类或者函数,这种转换发生在编译时; 模板支持将类型作为参数的程 阅读全文
posted @ 2020-08-03 09:31 NaughtyCoder 阅读(384) 评论(0) 推荐(0)
摘要:虚函数表指针位置分析 类:有虚函数,会产生一个虚函数表; 类对象:有一个指针,指针vptr会指向虚函数表的开始地址; 虚函数指针的位置 虚函数表位于整个对象模型的顶端; // objModel.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <ios 阅读全文
posted @ 2020-07-23 17:31 NaughtyCoder 阅读(209) 评论(0) 推荐(0)
摘要:继承的构造函数 一个类只继承其直接基类的构造函数,默认/拷贝/移动构造函数是不能被继承的; 继承Father的构造函数 using Father::Father; //继承Father的构造函数 using让某个名字在当前的作用域可见; //编译器遇到这条代码的时候,会把基类的每个构造函数都生成一个 阅读全文
posted @ 2020-07-22 11:13 NaughtyCoder 阅读(274) 评论(0) 推荐(0)
摘要:对象移动 C++11引入对象移动;进行所有权的转移; 移动构造函数和移动赋值运算符应该完成的功能 确保必要的内存移动,斩断原对象和内存的关系; 确保移动后原对象处于一种“即便被销毁也没有什么问题”的一种状态;A > B,确保不再使用A,而是应该去使用B; 移动构造函数 引入目的:提高程序效率; 说明 阅读全文
posted @ 2020-07-22 11:05 NaughtyCoder 阅读(289) 评论(0) 推荐(0)
摘要:临时对象 C++中真正的临时对象是不可见的,在源代码中不会出现,且不在堆上分配内存(在栈中),没有名字的对象; //i++ ++i //i++ 会产生一个临时对象,用来记录i的值; int i = 1; int &&r = i++; //i和r没关系 产生临时对象的情况 临时对象可能发生于如下的三种 阅读全文
posted @ 2020-07-21 08:33 NaughtyCoder 阅读(269) 评论(0) 推荐(0)
摘要:派生类对象模型 子类对象包含多个组成部分(也就是多个子对象); 含有派生类自己定义的成员变量、成员函数的子对象; 该派生类所继承的基类的子对象,这个子对象包含的是基类中定义的成员变量、成员函数(派生类对象含有基类对应的组成部分); 两部分数据在内存中的存储可能不连续; 基类指针可以new派生类对象, 阅读全文
posted @ 2020-07-21 08:00 NaughtyCoder 阅读(661) 评论(0) 推荐(0)
摘要:左值和右值 左值:能用在赋值语句等号左侧的东西;能够代表一个地址; 右值:不能作为左值的值就是右值,右值不能出现在赋值语句等号的左侧; 结论: C++的表达式,要么是左值,要么是右值,不能能两者都不是; 左值有的时候能够被当做右值使用; int i = 10; i = i + 1; //i是个左值, 阅读全文
posted @ 2020-07-20 23:49 NaughtyCoder 阅读(371) 评论(0) 推荐(1)