C++
文章平均质量分 69
骑猪去兜风..
无
展开
-
C++中如何压制虚拟机制
C++中,如果一个类有虚拟函数的时候,当使用该类的指针调用其虚函数的时候,代码会被编译器转换为使用虚函数表中保存的函数地址找到函数后二次调用。比如:class D {public: virtual void f1() { this->fun(); } virtual void fun() { cout << "123" << endl; }};int mai...原创 2018-05-07 15:35:27 · 409 阅读 · 0 评论 -
C++中的存储区域
一个由C/C++编译的程序占用的内存分为以下几个部分1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。3.全局(静态)存储区:存放...原创 2018-05-07 11:45:19 · 819 阅读 · 0 评论 -
C++中的4种显式类型转换
命名的强制类型转换符号的一般形式如下:cast-name<type>(expression);其中,cast-name为const_cast,static_cast,dynamic_cast和reinterpret_cast之一,type为转换的目标类型,而expression则是被强制转换的表达式。const_castconst_cast只能改变运算对象的底层的con...原创 2018-05-06 14:30:14 · 1513 阅读 · 0 评论 -
C++类型转换操作符和转换构造函数
定义:类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义将类类型值转变为其他类型值的转换。转换操作符在类定义体内声明,在保留字 operator 之后跟着转换的目标类型。函数原型T1::operator T2() const说明:1. 转换函数必须是成员函数,不能指定返回类型,并且形参表必须为空;返回值是隐含的,返回值是与转换的类型相同的,即为上面原型...原创 2018-05-06 10:45:57 · 1016 阅读 · 0 评论 -
C++中构造函数不能声明为虚函数
构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。不建议在构造函数和析构函数里面调用虚函数。构造函数不能声明为虚函数的原因是:1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象 的实际类型,是该类本身,还是该类的一个派生类,或是更深层次的派生类。无法确定。2 ...原创 2018-05-03 21:53:49 · 1375 阅读 · 1 评论 -
int和size_t
整型的每一种都分为:无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的正整数数据,比如16位系统中一个short能存储的数据的范围为-32768~32767,而...原创 2018-04-05 11:46:49 · 2370 阅读 · 0 评论 -
C/C++中memmove和memcpy的区别
memcpy、memmove与字符串函数strcpy区别memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行操作。memcpy与memmove拷贝多少是通过其第三个参数进行控制而strcpy是当拷贝至'\0'停止。函数说明 1.memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始...原创 2018-03-27 11:27:25 · 813 阅读 · 0 评论 -
指针和迭代器
迭代器Iterator(迭代器)模式又称Cursor(游标)模式,用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。或者这样说可能更容易理解:Iterator模式是运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素。迭代器和指针相同点:均提供了对对象的间接...原创 2018-03-23 21:33:05 · 453 阅读 · 0 评论 -
函数的重载、重写、重定义
函数重载(overload)函数重载是指在一个类中声明多个名称相同但参数列表不同的函数,这些的参数可能个数或顺序,类型不同,但是不能靠返回类型来判断。特征是:(1)相同的范围(在同一个作用域中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无(注:函数重载与有无virtual修饰无关);(5)返回值可以不同;函数重写(也称为覆盖 override)...原创 2018-07-11 15:17:29 · 6390 阅读 · 1 评论 -
关于C++模板分离式编译
以前一直没注意这个问题,下面进行总结分离编译模式一个项目如果有多个源文件组成,每个源文件单独编译,形成目标文件。最后通过链接器将所有的目标文件链接起来,形成一个可执行的文件。这个过程就叫做分离编译。分离式编译的优势如果工程巨大(比如linux内核源码) , 当你只修改了其中一个文件的时候,只要编译改动过的就可以了,不需要全部重新编译。模板不能分离编译有一个项目,其中函数声明...原创 2018-12-16 17:10:36 · 616 阅读 · 0 评论 -
C++11中一些常见的特性
C++11标准由国际标准化组织(ISO)和国际电工委员会(IEC)旗下的C++标准委员会(ISO/IEC JTC1/SC22/WG21)于2011年8月12日公布[2],并于2011年9月出版。2012年2月28日的国际标准草案(N3376)是最接近于C++11标准的草案(仅编辑上的修正)。此次标准为C++98发布后13年来第一次重大修正。一、auto类型说明符auto类型说明符能够...原创 2018-11-16 18:21:10 · 225 阅读 · 0 评论 -
memset,memcpy,strcat,strcpy,strncpy,strcmy, strstr总结
size_t和int size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与操作系统有关。在32位架构中被普遍定义为:typedef unsigned int size_t;而在64位架构中被定义为:typedef unsigned long size_t;size_t在32位架构上是4字节,在64位架构上是8...原创 2018-09-06 21:25:36 · 929 阅读 · 0 评论 -
模板与泛型编程
定义模板函数模板1.实例化函数模板当我们调用一个函数模板时,编译器(通常)用函数实参来推断模板实参。cout<<compare(1,0)<<endl;//推断实参类型为int2.非类型模板参数除了定义类型参数,还可以在模板中定义非类型参数。一个非类型参数表示一个值而非一个类型。我们通过一个特定的类型名而非关键字class或typename来指定非类...原创 2018-08-29 19:43:50 · 315 阅读 · 0 评论 -
小心:数组作为形参以及返回数组指针
数组作为形参知识点1.数组的维度必须是一个常量表达式int main(void){ constexpr int i = 20; int j = 5;//不是常量表达式 int arr1[i];//正确 int arr2[j];//错误 system("pause"); return 0;}2.默认情况下,数组的元素被默认初始化。而且需要注意的是,和内置类型的变量一样,...原创 2018-08-24 20:52:16 · 2175 阅读 · 0 评论 -
处理类型
类型别名定义类型别名有两只方法,分别是:使用关键字:typedef (传统方法)使用关键字:using (新标准)typedef char* pstring;const pstring cstr = 0; // cstr 是指向char的常量指针(**const被识别为顶层const**)using int32_t = int; //int32_t是int的同义词aut...原创 2018-08-22 22:04:49 · 259 阅读 · 0 评论 -
右值引用和对象移动
右值引用右值C++( 包括 C) 中所有的表达式和变量要么是左值,要么是右值。通俗的左值的定义就是非临时对象,那些可以在多条语句中使用的对象。 所有的变量都满足这个定义,在多条代码中都可以使用,都是左值。右值是指临时的对象,它们只在当前的语句中有效。右值引用概念为了支持移动操作,C++11引入了一种新的引用类型-右值引用。就是必须绑定到右值的引用。我们通过&&而不...原创 2018-08-26 18:55:45 · 364 阅读 · 0 评论 -
C++中::前面什么都不写
#include using namespace std;void fun(){ cout << "::fun()" << endl;}class A{public: void fun() { cout << "A::fun()" << endl; } void test() { ::fun(); fun(); }};int main(){ A a;原创 2018-03-20 09:16:05 · 4895 阅读 · 0 评论 -
int()、char()是指什么
void main(){int a = int();cout double b = double();cout char c = char();cout system("pause");}原创 2018-03-23 10:04:21 · 700 阅读 · 0 评论 -
C++中的公有、保护、私有继承
C++中的三种访问权限C++ 的类中有三种不同的权限的说明符 private,public,protected 三种权限说明符为C++的封装性提供了支持,下面介绍一下三种权限说明符的允许访问的范围,即哪些函数可以访问。1.private :类(基类)自身的成员函数 类(基类)友元的成员函数2.public :基类自身的成员函数 基类友元的成员函数 基类所产生派生类的成员函数...原创 2018-01-29 18:34:55 · 586 阅读 · 0 评论 -
C++中运算符和表达式的总结
运算符1.在c++中有4种运算符明确规定了运算对象的求值顺序。分别是:“&&”、“||”、“,”、“?:”。2.运算符的结合性是指相同优先级的运算符在同一个表达式中,且没有括号的时候,运算符和操作数的结合方式,通常有从左到右 结合和从右到左结合两种方式。假设~是一个运算符,又有表达式a~b~c,如果~是左结合的,那么该表达式被解析为(a~b)~c,如 果~是...原创 2018-01-16 14:20:27 · 1145 阅读 · 0 评论 -
动态内存和智能指针
常见的智能指针概述在C++中,动态内存的管理是通过一对运算符来完成的,即new和delete。动态内存的使用容易出问题,比如忘记释放内存、释放正在使用的指针等。新的标准库提供了两种智能指针类型来管理动态对象。它们能够自动释放所指向的对象。shared_ptr允许多个指针指向同一个对象;unique_ptr则”独占“所指的对象。它们都定义在memory头文件中。auto_ptr智能指针已...原创 2018-01-23 19:09:35 · 959 阅读 · 0 评论 -
C++数组常记知识点以及指针对于数组的操作
数组1. 不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值;不允许使用vector对象初始化数组。但是,允许使用数组初始化vector对象。#include #include using namespace std;int main(){ int a[] = { 1,2,3,4,5,6 }; vector v1(begin(a),end(a));//拷贝原创 2018-01-15 21:17:37 · 542 阅读 · 0 评论 -
C++中标准库类型vector易忘知识点总结
Vector1.vector在开始创建的时候尽量创建空的vector对象,等到需要的时候再动态添加元素。2.如果循环内部包含有向vector对象添加元素的语句,则不能使用范围for循环,范围for循环的语法格式是: for(declaration:expression) statement 注意:expression表示的必须是一个序列,初始值列表、数组、vector、st原创 2018-01-15 13:01:42 · 382 阅读 · 0 评论 -
C++中的关联容器
1.关联容器类型有序容器使用比较函数来比较关键字,从而将元素按顺序存储。默认情况下,比较操作是采用关键字类型的类型的对象来组织元素。按关键字有序保存map关联数组;保存关键字-值对set关键字即值,即只保存关键字的容器multimap关键字可重复出现的mapmultiset关键字可重复出现的set无序集原创 2018-01-22 18:34:00 · 422 阅读 · 0 评论 -
C++中string结尾部分是否包含'\0'
一直困惑string是否有结尾标识符'\0',或者说是有'\0'但是不作为结尾标识符。下面进行测试#include <iostream>#include <string>using namespace std;int main(){ string s="abc"; char c[] = { 'a','b','\0','c' };//遇到\0就说明...原创 2018-01-14 21:51:45 · 13611 阅读 · 3 评论 -
指针、引用、const
引用:1. 引用必须被初始化,初始化完成以后,引用就和初始值对象一直绑定在一起,无法令其重新绑定到另外一个对象。2. 引用与指针不同,不属于对象的范畴(不属于对象,所以没有实际的地址,不能定义指向引用的指针),它只是为一个已经存在的对象所起的另外一个名字。不能定义指向引用的指针,因为引用不是对象,没有实际地址3. 一般来说,引用的类型都要和与之绑定的对象严格匹配,而且,引用只能绑...原创 2018-01-14 18:49:25 · 548 阅读 · 0 评论 -
C++中的析构函数和delete的关系
析构函数1.构造函数是初始化对象的非static数据成员,在函数体中还可以另外做一些事情;析构函数则是释放对象使用的资源,并销毁对象的非static数据成员。析构函数,没有返回值,也不接受参数(导致不能被重载),所以对于一个给定的类,只会有一个唯一的构造函数。格式如下:~A();2.构造函数与析构函数的执行过程区别在构造函数中,先执行成员的初始化,且按照它们在类中出现的顺序原创 2018-01-24 20:52:08 · 12963 阅读 · 0 评论 -
C++中对文件的读、写操作
C++中对文件的写操作#include #include //对文件进行读写的头文件using namespace std;int main(){ FILE *fp; //errno_t是一种数据类型,实际上是一个整形,代表错误号码。 //比如0就代表没有错误,1就找不到文件等 errno_t err; char ch, filename[80]; cout << "请输入原创 2018-01-19 17:21:55 · 474 阅读 · 0 评论 -
C++中类的易忽略知识点(初级)
1.类的基本思想是数据抽象和封装。数据抽象是一种依赖于接口和实现分离的编程技术。类的接口包括用户所能执行的操作;类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需要的各种私有函数。封装实现了类的接口和实现的分离。封装后的类隐藏了它的实现细节,也就是说,类的用户只能使用接口而无法访问实现部分。2.常量成员函数(只针对成员函数),作用是修改隐式this指针的类型。因为在默认情况下,th...原创 2018-01-27 16:42:50 · 438 阅读 · 0 评论 -
C++的虚函数与作用域
1.作用域的说明:每个类定义自己的作用域,在这个作用域内我们定义类的成员。当存在继承关系时,派生类的作用域是嵌套在其基类的作用域内。如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义。2.虚函数说明:当我们使用基类的引用或指针调用一个虚成员函数时会执行动态绑定,因为我们直到运行时才能知道调用了哪个版本的虚函数,所以所有虚函数都必须有定义。通常原创 2018-01-26 14:56:47 · 639 阅读 · 0 评论 -
C++中函数的参数与返回值知识点
参数传递1.值传递:把实参的值拷贝给形参,形参和实参是两个相互独立的对象。2.引用传递:形参是引用类型,它将绑定到对应的实参上。3.指针形参:指针的行为和其它非引用类型一样。将形参传递给实参时,是拷贝指针的值(也就是地址)。拷贝之后,两个指针是不同的指针,但是他们指向的地址相同, 所以通过指针可以修改它所指的对象的值。 总结:尽量使用引用形参,在拷贝大的类类型对象或者容原创 2018-01-18 13:36:04 · 2018 阅读 · 0 评论 -
重载运算与类型转换
重载运算1.基本概念:名字由关键字operator和其后要定义的运算符号共同组成。对于一个运算符来说,它或者是类的成员,或者至少含有一个类类型的参数。通常情况下,不应该重载逗号、取地址、逻辑与和逻辑或运算符。2.当我们定义重载的运算符时,必须首先决定是将其声明为类的成员函数还是声明为一个普通的非成员函数。一般来说<1>赋值、下标([])、调用(())和成员访问箭头运...原创 2018-01-25 21:46:25 · 412 阅读 · 0 评论 -
C++中可调用对象与function以及bind
可调用对象的定义:对于一个对象或者一个表达式,如果可以对其使用调用运算符就是指运算符(),则称它为可调用的。我们可以向一个算法传递任何类别的可调用对象。总结一下C++中的可调用对象:函数、函数指针、lambda表达式、bind创建的对象以及重载了函数调用运算符的类注意:lambda有它自己唯一的类类型,只不过是未命名的。然而,不同类型的可调用对象可能共享同一种调用形式。调用形式...原创 2018-01-25 15:52:37 · 1301 阅读 · 0 评论 -
C++中重载箭头运算符详解
首先看一个例子#include using namespace std;class A{ void fun() { cout << "amazing" << endl; }};int main(){ A a; a->fun();//错误。“A”类型没有重载成员“operator ->” system("pause"); return 0;}一般来说,类对象不能使原创 2018-01-25 12:53:12 · 2327 阅读 · 2 评论 -
你不知道的拷贝、赋值、移动构造函数
前言:当定义一个类时,我们显式地或隐式地指定在此类型的对象拷贝、移动、赋值和销毁时做什么。一个类通过定义五种特殊的成员函数来控制这些操作,包括:拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符和析构函数。拷贝和移动构造函数定义了当用同类型的而另一个对象初始化本对象时做什么。拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么。析构函数定义了当此类型对象销毁时做什么。这些原创 2018-01-24 21:24:22 · 1448 阅读 · 0 评论 -
C++中的迭代器和泛型算法
简单的迭代器和算法1.迭代器令算法不依赖于容器,但算法依赖于元素类型的操作。泛型算法本身不会执行容器的操作,它们只会运行于迭代器之上,执行迭代器的操作。算法永远不会改变底层容器的大小。算法可能改变容器中保存的元素的值,也可能在容器内移动元素,但永远不会直接添加或删除元素。2.常见的只读算法accumulate vector v = {1,2,3}; //这条语句将sum设置为v中原创 2018-01-22 11:18:10 · 779 阅读 · 0 评论