
c++笔记
shayne000
这个作者很懒,什么都没留下…
展开
-
c++对象模型和单继承,多继承,虚继承模型
c++对象模型类中成员分类数据成员分为静态和非静态,成员函数有静态非静态以及虚函数class data members:static和nonstaticclass data functions:static、nonstatic和virtualC++对象模型在此模型下,nonstatic 数据成员被置于每一个类对象中,而static数据成员被置于类对象之外。static与nonstat...原创 2019-03-14 09:56:20 · 293 阅读 · 0 评论 -
c++虚函数详解及其实现
虚函数:虚函数是一种在基类定义为virtual的函数,并在一个或多个派生类中再定义的函数。虚函数的特点是,只要定义一个基类的指针,就可以指向派生类的对象。注:无虚函数时,遵循以下规则:C++规定,定义为基类的指针,也能作指向派生类的指针使用,并可以用这个指向派生类对象的指针访问继承来的基类成员;但不能用它访问派生类的成员。使用虚函数实现运行时的多态性的关键在于:必须通过基类指针访问这些函数。...原创 2019-03-15 15:47:14 · 1232 阅读 · 0 评论 -
vector 遍历
vector v;1. for循环int a=v.size( );for(int i=0; i!=a; i++) { }2.迭代器for(vector::iterator it=v.begin( ); it!=v.end( ); it++) { }3.常量迭代器for(vector::const_iterator it=v.cbegin( ); it!=v.cend( ); it++...原创 2019-03-15 15:50:13 · 1217 阅读 · 0 评论 -
c++类型转换
c风格的类型转换:TYPE a=(TYPE)b;但是c 风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向非 const对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的指针,这两种转换之间的差别是巨大的,但是传统的c语言风格的类型转换没有区分这些。c++提供的4种类型转换1.stati...原创 2019-03-15 16:12:29 · 195 阅读 · 0 评论 -
c++编译期多态与运行期多态,显示接口和隐式接口
运行期多态(runtime polymorphism)运行期多态的设计思想要归结到类继承体系的设计上去。对于有相关功能的对象集合,我们总希望能够抽象出它们共有的功能集合,在基类中将这些功能声明为虚接口(虚函数),然后由子类继承基类去重写这些虚接口,以实现子类特有的具体功能。典型地我们会举下面这个例子:运行期多态的实现依赖于虚函数机制。当某个类声明了虚函数时,编译器将为该类对象安插一个虚函数...原创 2019-03-16 08:32:25 · 394 阅读 · 0 评论 -
c++程序编译过程及相关概念
编译把源文件中的源代码翻译成机器语言,保存到目标文件中。如果编译通过,就会把CPP转换成OBJ文件。编译单元:每个cpp就是一个编译单元,每个编译单元相互之间是独立且相互不知的。一个编译单元(Translation Unit)是指一个.cpp文件以及这所include的所有.h文件,.h文件里面的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件,后者拥有...原创 2019-03-13 11:00:04 · 1104 阅读 · 0 评论 -
c++类内的static变量初始化和static函数
class A{static int si;static void sfunc(){cout<< si;}};int A::si=0;//静态成员不能在类内初始化。使用时:int tmp=A::si类的static member不会存在每一个具体的class object之中,而是存放在全局变量区,不论一个class有多少个具体实例,static data都只有一个。...原创 2019-03-13 14:51:15 · 3677 阅读 · 0 评论 -
c++2.0新特性(c++11/14)
语言部分1. Variadic Templates可变参数模板可以设计不同个数,不同类型的参数模板。2. nullptrnullptr 出现的目的是为了替代 NULL。在某种意义上来说,传统 C++ 会把 NULL、0 视为同一种东西,这取决于编译器如何定义 NULL,有些编译器会将 NULL 定义为 ((void*)0),有些则会直接将其定义为 0。nullptr 的类型为 null...原创 2019-03-13 15:53:54 · 1175 阅读 · 0 评论 -
lambda表达式
lambda表达式产生的是未命名的函数对象anonymous functor,类似于inline函数[capture list] (params list) mutable exception -&gt; rettype { function body }capture list:捕获外部变量列表(值,引用)params list:形参列表mutable指示符:用来说用是否可以修改捕获...原创 2019-03-13 16:13:33 · 204 阅读 · 0 评论 -
c++2.0新特性:Variadic Templates可变参数模板
原来的模板参数可以使类和函数的参数类型“任意化”,如果再加上“参数个数的任意化”,那么在参数方面的设计手段就基本上齐备了,有了variadic template 显然可以让设计出来的函数或是类有更大的复用性。关键词 …eg:1.对输入不同个数不同类型参数打印递归实现void printX() {} //当最后没有参数时结束打印(什么也...原创 2019-03-13 16:25:51 · 347 阅读 · 0 评论 -
c++2.0新特性:右值引用和move语义
右值引用:解决不必要的copy。左值和右值的区别:1 .左值可以寻址,而右值不可以。2 .左值可以被赋值,右值不可以被赋值,可以用来给左值赋值。3 左值可变,右值不可变(仅对基础类型适用,用户自定义类型右值引用可以通过成员函数改变)。例如:class mystring{ char *data; int size;};x,y为mystringmystring a(x); ...原创 2019-03-13 16:56:52 · 574 阅读 · 0 评论 -
c++常量表达式constexpr
常量表达式必须在编译期间计算出它的值并且 它的值不可以被改变。常量表达式主要是允许一些计算发生在编译时,即发生在代码编译而不是运行的时候。这是很大的优化:假如有些事情可以在编译时做,它将只做一次,而不是每次程序运行时。需要计算一个编译时已知的常量。 constexpr int mf = 20; // 常量表达式 constexpr int limit = mf + 1;...原创 2019-03-13 17:02:37 · 433 阅读 · 0 评论 -
c++使用vector建立最大堆和最小堆
1. 建堆vector<int> nums={6, 9, 2, 4, 7, 0, 1, 8, 3, 5};构建最大堆make_heap(nums.begin(), nums.end());//ormake_heap(nums.begin(), nums.end(), less<int>());输出nums的结果为9 8 2 6 7 0 1 4 3 5 ...原创 2019-05-20 17:15:44 · 782 阅读 · 0 评论 -
c++计算一个类的sizeof()
sizeof()返回为字节数。一般与所用的编译器和机器(64位或者32位)有关。一个空的类sizeof()返回1。因为一个空类也要实例化,所谓类的实例化就是在内存中分配一块地址,每个实例在内存中都有独一无二的地址。同样空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof()为1。sizeof()一个函数对象(functor)一般...原创 2019-03-15 15:31:05 · 1741 阅读 · 0 评论 -
模板为什么不支持分离式编译
编译器可以推断函数模板参数类型,但是不能推断类模板参数类型,类模板需要用<Typename>显示表明类型。在类模板中 函数的定义通常也放在头文件中编译器在遇到模板时不会生成代码,在实例化出一个模板的特定版本时才会生成代码(二进制)模板需要两次编译:第一次编译是在实例化之前:用来分析基本的语法错误,第二次编译是在实例化之后,当把这个类型替换之后,判断有没有语法错误。产生二进制代...原创 2019-03-15 14:47:38 · 232 阅读 · 0 评论 -
c++模板与泛型编程
函数模板template &lt;typename T&gt;inline T const&amp; Max (T const&amp; a, T const&amp; b) { return a &lt; b ? b:a; } 调用函数时,编译器会进行实参推到,由传入的参数推断类型T,不用手动输入。类模板template &lt;class T&原创 2019-03-15 11:22:18 · 284 阅读 · 0 评论 -
多态相关问题
多态polymorphism:以一个public base class的指针或者reference,寻址出一个derived class object。多态只能通过base class的指针或者引用来实现。现有基类A,其派生类BA *pa=B;A &ra=B;A a=B; //将B截断,只保留A的部分。其中并不能知道pa和ra具体是什么类型,可能是A或者A的派生类,用...原创 2019-03-14 10:00:33 · 170 阅读 · 0 评论 -
c/c++程序中main(int argc, char *argv[])参数解释
*argc是命令行总的参数个数argv[ ]是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数,char argv[]是一个字符数组,其大小是int argcmain函数可以带参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个, 习惯上这两个参数写为argc和argv。因此,main函数的函数头可写为: main (ar...原创 2019-03-14 10:07:11 · 578 阅读 · 0 评论 -
c++ #include 尖括号 和 引号 区别
&lt;&gt;引用的是编译器的类库路径里面的头文件。先去系统目录中找头文件,如果没有再到当前目录下找。所以像标准的头文件 stdio.h、stdlib.h等用这个方法。""引用的是你程序目录的相对路径中的头文件。首先在当前目录下寻找,如果找不到,再到系统目录中寻找。 这个用于include自定义的头文件,让系统优先使用当前目录中定义的。...原创 2019-03-14 10:10:34 · 379 阅读 · 0 评论 -
c++中using声明和using指示
using声明声明的形式:using namespace_name::name一个using声明一次只引入一个命名空间成员。using声明中引入的名字遵循常规作用域规则:从using声明点开始,直到包含该using声明的作用域的末尾,名字都是可见的。外部作用域中定义的同名实体被屏蔽using指示形式:using namespace 命名空间名using指示同using声明一样,可以...原创 2019-03-14 10:17:52 · 913 阅读 · 0 评论 -
程序内存分区
栈区(stack)— 由编译器自动分配释放存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;在函数完成执行,系统自行释放栈区内存,不需要用户管理。整个程序的栈区的大小可以在编译器中由用户自行设定,VS中默认的栈区大小为1M,可通过VS手动更改栈的大小。64bits的Linux默认栈大小为10MB,可通过ulimit -s临时修改。堆区(heap)— 一般由程序员分配释放若...原创 2019-03-14 10:27:01 · 1094 阅读 · 0 评论 -
c++中new/delete和malloc/free区别详解
使用new操作符来分配对象内存时会经历三个步骤:第一步:调用operator new函数(对于数组是operator new[])分配一块足够大的,原始的,未命名的内存空间以便存储特定类型的对象。第二步:编译器运行相应的构造函数以构造对象,并为其传入初值。第三部:对象构造完成后,返回一个指向该对象的指针。其中operator new可以用malloc实现使用delete操作符来释放对象内...原创 2019-03-14 14:23:57 · 366 阅读 · 0 评论 -
c++数组指针和指针数组详解
指针数组:指针数组可以说成是”指针的数组”,首先这个变量是一个数组,其次,”指针”修饰这个数组,意思是说这个数组的所有元素都是指针类型,在32位系统中,指针占四个字节。数组指针:数组指针可以说成是”数组的指针”,首先这个变量是一个指针,其次,”数组”修饰这个指针,意思是说这个指针存放着一个数组的首地址,或者说这个指针指向一个数组的首地址。指针数组首先先定义一个指针数组,既然是数组,名字就...原创 2019-03-14 15:33:16 · 26258 阅读 · 1 评论 -
c++指针常量与常量指针详解
指针常量 (顶层const)指针常量:顾名思义它就是一个常量,但是是指针修饰的。 定义以后不能再指向其他对象,类似于引用说明指针变量不允许修改。如同次指针指向一个地址该地址不能被修改,但是该地址里的内容可以被修改int * const p //指针常量int a,b;int * const p=&a //指针常量//那么分为一下两种操作*p=9;//操作成功 相当于a=9...原创 2019-03-14 16:54:07 · 345 阅读 · 0 评论 -
c++字符数组和字符指针区别以及str***函数
C风格字符串都是以’\0’结尾的。所以如果拷贝一个字符串,请确保计算的长度已经考虑了这个结尾符号。另外C风格的字符串是在内存上动态申请数组存储的,所有的保护措施需要申请者自己维护,new过之后一定要delete。字符指针//先在文字常量区为"abcde"常量分配6B,接着在栈里为指针pStr分配4B,并接收"abcd"字串的首地址char* pStr = “abcde”;pStr[0]=...原创 2019-03-15 08:59:09 · 415 阅读 · 0 评论 -
c++的string类初始化及其常用函数
初始化: char ch_music[] = {"Roly-Poly"}; string str1 = "yesterday once more"; string str2 ("my heart go on"); string str3 (str1,6); // = day once more string str4 (str1,6,3)...原创 2019-03-15 09:14:44 · 555 阅读 · 0 评论 -
c++类的操作符重载注意事项
=重载 class& operator=(const class&)一定要在operator = 中检查是否self assignment 对象的自我赋值1.先清空现有的成员(释放当前内存空间)2.传递拷贝进来的成员3.return *this4.可以考虑是否加入转移赋值class& operator=( class&&);<<重载...原创 2019-03-15 10:09:27 · 350 阅读 · 0 评论 -
c++基类,派生类 ,接口,继承方式
基类通常应该定义一个虚析构函数;基类用virtual关键字声明的虚函数可以在派生类中重新定义,在派生类中重新定义时最好也加上virtual关键字通过指针或引用调用的虚函数在运行时才会被解析,其他函数在编译时就会被解析。动态绑定(多态):用一个基类的引用(或指针)调用一个虚函数时,传入不同的派生类或者基类将调用不同的函数实现。基类引用可以指向派生类是因为派生类含有基类的部分,编译器 会隐式...原创 2019-03-15 10:56:20 · 1042 阅读 · 1 评论 -
C++单例模式实现
简述单例模式(Singleton Pattern)是设计模式中最简单的形式之一,其目的是使得类的一个对象成为系统中的唯一实例。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一对象的方式,可以直接访问,不需要实例化该类的对象。要点单例模式的要点有三个:单例类有且仅有一个实例单例类必须自行创建自己的唯一实例单例类必须给所有其他对象...原创 2019-07-22 10:57:41 · 205 阅读 · 0 评论