C++
张荣华_csdn
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++的类型转换操作符
C++中提供了四种类型转换操作符:static_cast, dynamic_cast, const_cast, reinterpret_cast。1.static_cast. 可以完全代替C风格的类型转换实现基本类型转换。也可以将父类指针转换成子类指针,将子类指针转换为父类指针。如果父类指针本身就指向一个子对象,则不存在安全性问题。class Base(){};class D...原创 2018-05-12 13:46:13 · 291 阅读 · 0 评论 -
静态全局变量
在全局变量前加上static关键字,就定义了一个静态全局变量。通常情况下,静态全局变量的声明和定义放在源文件中,并且不能使用extern关键字将静态全局变量导出,因此静态全局变量的作用域仅限于定义静态全局变量所在的文件内部。 普通全局变量的作用域是整个工程,在头文件中使用extern关键字声明普通全局变量,并在源文件中定义,其他文件中只要使用#include包含声明普...原创 2018-05-12 13:59:27 · 4384 阅读 · 1 评论 -
面向对象的基本概念
1.对象面向对象方法中的对象,是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位。对象由一组属性和一组行为构成。属性是用来描述对象静态特征的数据项,行为是用来描述对象动态特征的操作序列。2.类类是具有相同属性和服务的一组对象的集合。3.封装封装是面向对象方法的一个重要原则,就是把对象的属性和服务结合成一个独立的系统单位,并尽可能屏蔽对象的内部细节。4.继承特殊类的对象拥有其一般类的...原创 2018-05-12 15:25:19 · 1368 阅读 · 0 评论 -
计算机采用二进制码的优点
1.易于物理实现;2.二进制运算简单;3.机器可靠性高;4通用性强。原创 2018-05-12 15:28:40 · 15417 阅读 · 0 评论 -
原码,反码和补码
原码:将符号位数字化为0或1,数的绝对值与符号一起编码反码:正数的反码与原码表示相同,负数反码的符号位与原码相同(仍用1表示),其余各位取反补码:对于正数来说,其原码、反码、补码形式相同;对于一个负数,其补码由该数反码的最末位加1求得。...原创 2018-05-12 15:34:02 · 420 阅读 · 0 评论 -
算术运算符
C++的算术运算符包括基本算术运算符和自增自减运算符。由算术运算符、操作数和括号构成的表达式称为算术表达式。 基本算数运算符:+、-、*、/、%。 %是取余运算,只能用于整形操作数。 /用于两个整型数据相除时,其结果取商的整数部分,小数部分被自动舍弃。...原创 2018-05-12 15:40:35 · 513 阅读 · 0 评论 -
赋值运算符
带有赋值运算符的表达式被称为赋值表达式。赋值表达式的作用就是将等号右边表达式的值赋给等号左边的对象。 赋值表达式的类型为等号左边对象的类型,其结果值为等号左边对象被赋值后的值,运算的结合性为自右向左。 除了“=”之外,还有10中符合的赋值运算符,例如“+=“,”*=”,“&=”等。...原创 2018-05-12 15:44:44 · 296 阅读 · 0 评论 -
逗号运算
表达式1,表达式2.求解顺序为先求解1.再求解2,最终结果为表达式2的值。a=3*5,a*4最终的结果为60原创 2018-05-12 15:46:29 · 571 阅读 · 0 评论 -
位运算
1.按位与&将两个操作数对应的每一位分别进行逻辑与操作2.按位或|将两个操作数对应的每一位分别进行逻辑或操作3.按位异或^将两个操作数对应的每一位进行异或4.按位取反~对一个二进制数的每一位取反5.移位左移运算<<,右移运算>>...原创 2018-05-12 15:53:28 · 208 阅读 · 0 评论 -
I/O格式控制
endl:插入换行符,并刷新流;ends:插入空字符;setprecision(int):设置浮点数的小数位数(包括小数点);setw(int):设置域宽;#include<iostream>#include<iomanip>using namespace std;int main(){ cout << setw(5) << setprecision...原创 2018-05-13 12:08:57 · 611 阅读 · 0 评论 -
#include《》和#include“”的区别
#include<>在搜索时直接从编译器指定的路径处搜索;#include“”首先在程序当前目录中进行搜索,然后再从编译器指定的路径处搜索。原创 2018-05-07 13:18:49 · 1284 阅读 · 0 评论 -
#和##在define中的作用
宏定义中的#运算符可以把#后面的宏参数进行完整的字符串替换;#define printcube(x) cout<<(x)*(x)*(x)<<endl;printcube(5);输出:125;宏定义中的##运算符将前后的参数进行字符串连接;#define link(x,y,z) x##y##zlink("C","+","+");输出:C++。...原创 2018-05-07 13:21:37 · 546 阅读 · 0 评论 -
assert断言的概念
assert用于在程序的DEBUG版本中检测条件表达式。如果条件为假,则输出诊断信息并终止程序运行。由于assert是一个宏,对其过于频繁的使用会在一定程度上影响程序的性能,增加额外的开销。一个良好的编程习惯是在调试结束后,在#include语句之前插入#define NDEBUG禁用assert宏。...原创 2018-05-07 13:24:52 · 748 阅读 · 0 评论 -
i++和++i的区别
i++是先赋值后加一;++i是先加一后赋值。int i=10,j=10;int m=(i++)+(i++)+(i++);int n=(++j)+(++j)+(++j);最终的m值为30,i值为13. 不同的编译器处理++j的规则不同,在VC编译器中,n值为39,j为13;在GCC编译器中,n值为37,j为13....原创 2018-05-07 13:30:43 · 271 阅读 · 0 评论 -
赋值运算符函数
剑指offer:01给定一个类型的声明,为该类型添加赋值运算符函数。class MyString{public: MyString(char* p = nullptr); MyString(const MyString& str); ~MyString(void);private: char* data;};需要注意一下几点:1.是否把返回值的类型声明为该类型的应用,并在函数结束前返回实例...原创 2018-05-14 16:23:11 · 850 阅读 · 0 评论 -
数组和指针的区别
int GetSize(int data]){return sizeof(data);}int main(){ int data1[]={1,2,3,4,5}; int size1=sizeof(data1); int *data2=data1; int size2=sizeof(data2); int size3=...原创 2018-05-14 16:34:07 · 193 阅读 · 0 评论 -
内联函数与宏定义的区别
内联函数和宏定义都是能够节省频繁的函数调用过程中所产生的时间和空间的开销,提高程序执行的效率,二者的目的是相同的。内联函数和宏定义都是通过将函数调用替换成完整的函数体,二者的实现也是类似的。内联函数和宏定义根本的区别在于宏定义仅仅只是字符串替换,而内联函数是个函数,具有函数基本性质,因此内联函数可以向普通函数一样调试,而宏定义不能。内联函数和宏定义的代码展开发生在程序执行的不同阶段,宏定义的展开是...原创 2018-05-21 10:13:57 · 699 阅读 · 0 评论 -
不使用临时变量交换两个数
方法一:a=a-b;b=a+b;a=b-a;方法二:利用异或关系:a=b^a^b:a=a^b;b=a^b;a=a^b;原创 2018-05-21 11:35:23 · 624 阅读 · 0 评论 -
简述malloc/free与new/delete的区别
malloc/free是C语言提供的库函数,通过函数调用访问,需要传递参数并接收返回值;而new/delete是C++提供的运算符。malloc/free只能用于基本类型,而new/delete不但可以应用于基本类型,还可以应用于面向对象中的自定义类型。malloc函数返回的是void*类型,程序需要显示地转换成所需要的指针类型;new操作符后面直接指明了类型,不涉及类型转换问题。malloc函数...原创 2018-05-21 11:42:49 · 997 阅读 · 0 评论 -
malloc和free的常识性问题
free函数负责释放空间,具体流程是更新可用空间链表,将这段空间标记为可用,但不会将指针置空,在调用free函数空间后用该立即手动将指针置空。malloc函数返回申请空间的首地址,free函数接受的参数也应该是这个首地址,因此在使用过程中一动不能失去对这个首地址的控制。如果修改了指向首地址的指针,而首地址没有与其他指针关联,就无法调用free函数正确地释放空间。malloc函数和free函数总是成...原创 2018-05-21 11:48:11 · 1567 阅读 · 0 评论 -
函数指针
指针变量可以指向任意类型的数据,也可以指向一个函数。每个函数在内存中都占用一段存储单元,这段存储单元的首地址称为函数的入口地址,指向这个函数入口地址的指针称为函数指针。在定义函数指针时必须指明函数指针所指向函数的返回值和参数列表。举个例子:int max(int a,int a){return a>b?a:b;}int (*p)(int ,int)=max;int x=10,...原创 2018-05-21 12:28:21 · 364 阅读 · 0 评论 -
this指针
在面向对象程序设计中,每个非静态成员函数都包含一个特殊的指针,指向调用该函数的对象,这个指针称为this指针。当对象访问类中的非静态成员函数时,编译器会自动将对象的地址隐式地作为第一个参数传递给this指针,在非静态成员函数中访问非静态成员时都隐含地使用了this指针。this的作用域是在非静态成员函数内部,在调用非静态成员函数时构造this指针,在非静态成员函数调用结束后销毁this指针。...原创 2018-05-21 12:50:42 · 253 阅读 · 0 评论 -
C++的数据存储区
在程序中,数据存储在不同的区段,通常将整个数据区分成四部分:栈存储区、堆存储区、全局及静态存储区、常量存储区。栈存储区主要存储函数参数和局部变量,这部分数据的空间由编译器负责分配和回收,由于其存储数据时采用后进先出的方式,因此该区段被称为栈存储区。堆存储区主要存储动态分配的内存块,这部分数据的空间编译器不会自动处理,需要由程序员负责分配和回收。如果程序始终没有主动释放动态分配的空间,在该程序运行结...原创 2018-05-21 13:24:11 · 974 阅读 · 1 评论 -
C语言不支持函数重载的原因
C++在编译过程中对函数重命名的规则保证了重载函数在重命名后函数名的唯一性:重命名函数名=(返回值类型)作用域+原始函数名+参数列表;C语言在编译过程中并不会对函数重命名。...原创 2018-05-25 11:43:17 · 1193 阅读 · 0 评论 -
函数重载与函数覆盖的区别(C++)
函数重载overload,函数覆盖override函数重载是同一类中的不同方法,函数覆盖是不同类中的同一方法;重载函数的参数列表不同,覆盖函数的参数列表相同;重载函数调用时根据参数类型选择方法,覆盖函数调用时根据对象类型选择方法。...原创 2018-05-25 11:45:57 · 2137 阅读 · 0 评论 -
名字隐藏问题(C++)
所谓名字隐藏是指父类中有一组重载函数,子类在继承父类时如果覆盖了这组重载函数中的任意一个,则其余没有被覆盖的同名函数在子类中是不可见的。如果想解决名字隐藏问题,可以在子类中不使用覆盖函数,而是给子类的方法选择一个不同的函数名,区别于父类的方法,但是这样做有一个前提,就是在自类和父类中使用不同的方法名是可接受的。另一种解决方案就是子类覆盖父类中所有的重载方法,虽然子类中有些方法的实现与父类完全一致,...原创 2018-05-25 11:52:23 · 1162 阅读 · 0 评论 -
多态与虚函数(C++)
多态是指不同对象对于同样的消息做出不同的响应,C++的多态性通过虚函数实现。多态性的原理是延迟绑定,也就是在函数调用时才绑定函数,这也是虚函数的工作原理。徐艳数通过virtual关键字标识。可以将一个虚函数声明为纯虚函数,纯虚函数一般不给出具体实现,因此无法调用纯虚函数。含有纯虚函数的类称为抽象类,抽象类不能创建对象,只能作为父类使用。注意:1.构造函数不能声明为虚函数,但是析构函数可...原创 2018-05-25 14:16:29 · 234 阅读 · 0 评论 -
简述虚函数表的概念
如果一个类中有虚函数,那么这个类就对应一个虚函数表,虚函数表中的元素是一组指向函数的这孩子很,每个指针指向一个虚函数的入口地址。 在访问虚函数时,通过虚函数表进行函数调用。 在含有虚函数的类对象模型中,除了对象的数据成员外,还有一个指向虚函数表的指针,称为虚指针,虚指针位于对象模型的顶部。...原创 2018-05-25 14:24:04 · 296 阅读 · 0 评论 -
多态性(c++)
多态性是指一段程序能够处理多种类型对象的能力。在C++中,多态性可以通过强制多态、重载多态、类型参数化多态、包含多态等形式来实现。强制多态是通过将一种类型的数据转换成另一种类型的数据来实现的,也就是数据类型转换。重载是指给同一个名字的赋予不同的含义(函数重载和运算符重载)。这两种多态属于特殊多态性,只是表面的多态性。包含多态和类型参数化多态属于一般多态性,是真正的多态性。C++中采用虚函数实现包含...原创 2018-05-23 12:48:29 · 681 阅读 · 0 评论 -
运算符重载的规则
1.C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已经有的运算符;2.重载之后运算符的优先级和结合性都不会改变;3.运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。一般来讲,重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。...原创 2018-05-28 09:34:38 · 791 阅读 · 0 评论 -
内存泄漏(C++
内存泄露是一种资源泄露,是指计算机程序没有合理地管理已经分配的内存,导致不再使用的内存没有及时释放。随着程序运行时间的增长,泄露的内存越积越多,可用的内存越来越少,最终无法为程序分配新的内存,进而导致程序崩溃。产生内存泄漏的原因很简单,就是分配的内存没有及时回收。由于栈的内存由编译器负责分配和回收,因此不会发生内存泄漏问题;而堆的内存由程序员负责分配和回收,正是这种人为控制导致了内存泄漏的发生。具...原创 2018-05-23 13:08:57 · 215 阅读 · 0 评论 -
复制构造函数被调用的3种情况
1.当用类的一个对象去初始化该类的另一个对象时Point a(1,2);Point b(a);2.如果函数的形参是类的对象,调用函数时,进行形参和实参结合时void f(Point a){}int main(){ Point a(1,2); f(a); return 0;}3.如果函数的返回值是类的对象,函数执行完成返回调用...原创 2018-05-24 09:43:19 · 1295 阅读 · 0 评论 -
结构体和类的区别
结构体和类的唯一区别在于,结构体和类具有不同的默认访问控制属性:在类中,对于未指定访问控制属性的成员,其访问控制属性为私有类型;在结构体中,对于未指定任何访问控制属性的成员,其访问控制属性为公有类型。...原创 2018-05-24 09:43:09 · 2422 阅读 · 0 评论 -
error: stray '\357' in program
编译报错:error: stray '\357' in program原因:在程序中打入了全角字符原创 2018-06-12 09:25:40 · 2791 阅读 · 0 评论 -
fill()函数和fill_n()函数
fill函数的作用是:将一个区间的元素都赋予val值。函数参数:fill(vec.begin(), vec.end(), val); val为将要替换的值;fill_n函数的作用是:参数包括 : 一个迭代器,一个计数器以及一个值。该函数从迭代器指向的元素开始,将指定数量的元素设置为给定的值。注意: 不能在没有元素的空容器上调用fill_n函数。...原创 2018-06-13 01:55:45 · 8889 阅读 · 0 评论 -
初始化string对象的方式
string s1;string s2(s1);string s2=s2;string s3("value");string s3="value";string s4=(n,'c');原创 2018-06-13 01:55:37 · 304 阅读 · 0 评论 -
getline()函数
istream& getline ( istream &is , string &str , char delim );其中,istream &is 表示一个输入流,譬如cin;string&str表示把从输入流读入的字符串存放在这个字符串中;char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为'\n',也就是回车换行符(遇到回车停...原创 2018-06-12 09:25:25 · 256 阅读 · 0 评论 -
C++分割字符串
涉及到string类的两个函数find和substr: 1、find函数 原型:size_t find ( const string& str, size_t pos = 0 ) const; 功能:查找子字符串第一次出现的位置。 参数说明:str为子字符串,pos为初始查找位置。 返回值:找到的话返回第一次出现的位置,否则返回string::npos2、substr函数 原型:strin...原创 2018-06-12 09:28:10 · 739 阅读 · 0 评论 -
vector函数里的pair用法
STL中map通过键-值的形式保证一一对应关系,而multimap则可以出现一对多的关系,这两种数据类型在存储数据时,会根据pair<>的first成员进行排序,不同的是前者将不会插入对first成员重复的结构,而后者可以。 而当我们我们只想存储pair对,不需要对其排序时,就可以用到vector,将pair对插入其中即可。下面就使用做一些简单说明: 声明vector:vec...原创 2018-06-06 08:16:49 · 6768 阅读 · 0 评论 -
二进制中1的个数
方法一:常规解法首先把n和1做与运算,判断n的最低位是不是1.接着把1左移一位得到2,在和n做与运算,就能判断n的次低位是不是1……这样反复左移,每次都能判断n的其中一位是不是1.int NumberOf1(int n){ int count=0; unsigned int flag=1; while(flag) { ...原创 2018-05-24 20:48:50 · 230 阅读 · 0 评论
分享