C++编程易错总结
文章平均质量分 69
windmissing
喜欢编程,喜欢思考,方向明确
展开
-
间接调用虚函数
运行结果是什么?father *pf = new father();pf->A();pf->B();delete pf;father *ps = new son();ps->A();ps->B();delete ps;son *ps1 = new son();ps1->A();ps1->B();delete ps1;son *p...原创 2019-09-06 17:43:46 · 429 阅读 · 0 评论 -
const总结
一、const的作用1.将限定符声明为只读方法:(1)在类型前加关键字const(2)必须初始化举例:const int i = 5;//正确int j = 0;const int k;//编译错误i = j;//编译错误j = i;//正确2.在另一连接文件文件中引用常量方法:(1)在类型前加入关键字extern const(2)因为引用的是常量,不可以再次赋原创 2011-12-28 15:26:12 · 2557 阅读 · 10 评论 -
C++Primer笔记
(P?)头文件中应该只定义确实需要的东西。(P37)反斜线符号必须是该行的尾字符――不允许其后面有注释或空格。同样,后继行行首的任何空格和制表符都是字符串字面值的一部分,正因如此,长字符串字面值的后继行才不会有正常的缩进。(P42)直接初始化int ival(1024);、复制初始化int ival = 1024;与赋值ival = 1024;。初始化不是赋值。初始化是指创建变量并给它赋值原创 2013-11-24 19:03:08 · 3497 阅读 · 5 评论 -
数组与指向数组的指针总结
一、一维数组1.代码 int a[10], i; for(i = 0; i < 10; i++) a[i] = i * 10; int *pa = a; cout<<pa<<endl; cout<<*pa<<endl; cout<<pa+1<<endl; cout<<*pa+1<<endl; cout2.输出结果3.解释pa:a[原创 2012-10-22 21:52:14 · 1875 阅读 · 2 评论 -
类的sizeof
文字是转载的,图是原创的。1、空类的sizeof是1。空类是指没有成员的类,类中的函数不占空间,除非是虚函数。class A{ public: A(){} ~A(){} void fun(){}};sizeof(A)是1.注:class A1{ public: A1(){} ~A1(){原创 2012-08-13 10:35:22 · 2775 阅读 · 5 评论 -
static总结
一、不在类中的static的使用1.作用1.局部变量被申明为static,表示这个函数结束的时候这个的值不变。2.外部变量被申明为static表明它是一个本地全局变量。改变量只能在该文件内被访问,不能被其它文件访问。2.Static与非static的区别static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;stat原创 2012-01-11 19:02:29 · 2208 阅读 · 8 评论 -
.字符数组、字符串与string类总结
1.字符数组、字符串与string类的区别例1:int main(){ string s; cin>>s;//输入:dog if(s == "dog") cout<<"狗"<<endl; char ch[10]; cin>>ch;//输入:cat if(ch == "cat") cout<<"猫"<<endl; return 0;}输出:dog //原创 2012-09-27 15:43:37 · 2179 阅读 · 0 评论 -
记录,待总结
1.关于函数地址class A {public: void f() { int f = 0; } void h() { int h = 0; } virtual void g() = 0;};int main(){ cout<<&A::f<<endl; // 输出结果:1 cout<<&A::h<<endl; // 输出结果:1 cout<<&A::g<原创 2012-01-18 14:44:55 · 1374 阅读 · 0 评论 -
模板声明与定义要放在同一文件中?
“通常情况下,你会在.h文件中声明函数和类,而将它们的定义放置在一个单独的.cpp文件中。但是在使用模板时,这种习惯性做法将变得不再有用,因为当实例化一个模板时,编译器必须看到模板确切的定义,而不仅仅是它的声明。因此,最好的办法就是将模板的声明和定义都放置在同一个.h文件中。这就是为什么所有的STL头文件都包含模板定义的原因。”[1] “标准要求编译器在实例化模板时必须在上下文中可以查看到其定义实转载 2015-03-11 20:30:38 · 1351 阅读 · 4 评论 -
NULL是什么
对于NULL,大家都不会陌生。非常常用,尤其是在指针里面。 可是很奇怪,在很多编译器里,NULL是黑色的,它不是一个关键字。既然不是关键字,却不用定义就可以使用。原创 2015-03-12 19:43:46 · 1642 阅读 · 1 评论 -
析构函数的virtual在子类
运行结果是什么?father *pf = new father();delete pf;father *ps = new son();delete ps;son *ps1 = new son();delete ps1;son *pss = new sonson();delete pss;father *pss1 = new sonson();delete pss1;运行...原创 2019-09-06 17:41:14 · 807 阅读 · 0 评论 -
virtual关键字在子类
运行结果是什么?[外链图片转存失败(img-R5kgmjsy-1567762672089)(http://windmissing.github.io/images/2019/11.png)]father *pf = new father();pf->f();delete pf;father *ps = new son();ps->f();delete ps;son *p...原创 2019-09-06 17:38:48 · 530 阅读 · 0 评论 -
virtual关键字在父类
运行结果是什么?father *pss1 = new sonson();pss1->f();delete pss1;son *pss2 = new sonson();pss2->f();delete pss2;sonson *pss3 = new sonson();pss3->f();delete pss3;运行结果sonson::f()sonson...原创 2019-09-06 17:35:52 · 546 阅读 · 0 评论 -
结构体的初始化
带构造函数的结构体不能使用初始化列表的方式初始化 初始化结构体的两种方法struct noContructor{ int param1; int param2;};int main(){ //方法一:初始化列表 noContructor str1={1,2}; //方法二:先定义,再初始化 noContructor str2; str2.原创 2016-11-30 22:23:25 · 716 阅读 · 0 评论 -
C++里的对齐规则
什么是对齐? 在C/C++中,数据结构或类的成员变量,并不是按照它们的大小,一个一个紧凑地排列在空间上的。它们是按照一种特定的方法排列的,有可能在两个成员变量之间插入一个或个byte,以保证每个成员变量的起始位置是都是从某些特定的位置开始的。这就是对齐。单纯从语言上描述对齐有些枯燥难以理解,下文将配以例子说明C/C++是基于什么样的规则对齐的。为什么要对齐? 在大多数平台上,系统从某些特定原创 2015-09-15 19:03:16 · 5594 阅读 · 2 评论 -
从面向过程到面向对象
改变思维 曾经在学校学习数据结构课程时,第一节课上,老师就告诉我们:程序=数据结构+算法。这句话对我后来学习数据结构起了很大的作用,积极的作用。 可是后来学到C++面向对象部分时,这句话让我在有些地方怎么也想不通。想了很久之后,我得出了另一个结论,在面向对象程序中,程序=对象&行为。这里我使用&,是为了说明对象与行为是关系的。行为是对象的行为,对象要对它自己的行为负责。 这种思维上的转换在从P原创 2015-10-02 21:43:50 · 4672 阅读 · 2 评论 -
C语言进阶:整型提升
几乎每个程序员都学过C,而且大多数在他们的工作中使用C。很显然C是TIOBE(2012年11月时排榜首)上最流程的编程语言之一。然而,有时,C的行为会让人意外和困惑。其中一个例子就是**整型提升**。请看下面这个例子:#include <stdio.h>int main(void){ unsigned char a = 0xff; char b = 0xff; int c翻译 2015-08-25 19:50:02 · 7086 阅读 · 22 评论 -
操作符重载总结
一、重载的基本规则1.重载操作符的形参数目应与操作符的操作数数目相同。重载操作符作为类的成员函数,隐含一个*this作为函数的第一个函数2.重载后,优先级、结合性、操作数目不变。但是不能保证求值顺序求值顺序是指:在优先级、结合性相同的情况下,先求哪个3.不能创建新的操作符4.重载操作符必须至少有一个类类型或枚举类型5.不可重载的操作符:(原创 2012-01-14 15:27:34 · 1546 阅读 · 0 评论 -
多态总结
一、多态1.多态分为两种(1)编译时的多态:通过函数重载实现(2)运行时的多态,通过虚函数实现,即动态联编2.继承不是多态class father{public: virtual void run(){cout<<"父跑"<<endl;} void jump(){cout<<"父跳"<<endl;}};class son:public father{public原创 2012-01-17 20:59:20 · 2228 阅读 · 0 评论 -
复制控制成员总结
1.复制控制成员是指:复制构造函数、赋值操作符函数、析构函数2.关于复制构造函数,见:复制构造函数总结3.如果没有自己的赋值操作符函数,编译器会提供一个。赋值操作符也是依次复制每个非static成员,也是浅层复制。赋值操作符与复制构造的区别,只是不用为对象开辟新空间。4.析构对象的顺序,是创建对象的逆序,也即声明次序的逆序例:class A{原创 2012-01-12 15:58:05 · 1806 阅读 · 0 评论 -
函数返回值总结
例1:class A{ int x;public: A(int i):x(i){} int get(){return x;}};A& func(){ A a(23); return a;}int main(){ A &r = func(); cout<<r.get()<<endl; return 0;}输出:1245000原创 2012-01-17 14:07:00 · 1605 阅读 · 0 评论 -
复制构造函数总结
1.用同一类型的对象来初始化另一对象需要调用复制构造函数例1:class A{public: A(){} A(const A& a){cout<<"copy"<<endl;}};int main(){ A a, c; A b = a;//显式复制构造函数(1) c = a;//赋值函数(2) return 0;}本例要注意的是(1)和(2)的区别:复制构造函数也是构原创 2012-01-12 14:50:48 · 2975 阅读 · 1 评论 -
函数指针总结
1.一个函数的指针,必须确保该函数被定义且分配了内存,否则将指向空地址,这是指针的大忌。 2.函数指针的使用条件:参数、返回值都吻合‘ 3.函数指针没有++或--的运算 4.函数指针作为参数的最好的例子就是回调函数 5.函数指针的使用例:void (*p)(int &, int &);void cube(int &x, int &y){ x =原创 2012-01-18 14:25:45 · 1856 阅读 · 1 评论 -
参数传递的三种方式
1.按值传递void swap(int a, int b){ int temp = a; a = b; b = temp;}int main(){ int a = 2, b =3; swap(a, b); return 0;}优点:便于阅读缺点:不能改变主函数中的值 2.按指针传递void swap(int *a, int *b)原创 2012-01-22 14:39:17 · 2137 阅读 · 0 评论 -
指针与引用使用总结
一、指针1.指针的删除(1)删除指针后,要将指针赋为空 使用空指针是非法的,容易使程序崩溃 把指针赋为空是为了方便检查出错误(2)类的析构函数中,删除指针后,指针可以不清零。因为对象消失后,对象的成员指针就成为无法访问的指针(3)this指针记录的是当前对象的地址。 this指针的创建与删除由编译器完成 2.指针的加减对指针进行加减运算时原创 2012-01-16 10:39:40 · 1375 阅读 · 0 评论 -
构造函数、复制构造函数、析构函数混合使用总结
一、用法构造函数的用法:类的声明、定义与初始化复制构造函数的用法:复制构造函数总结2.一些混合使用的例子1.关于强制类型转换class A{ int x;public: A(int i):x(i){cout<<"construct "<<this<<endl;} A(const A& a){x = a.x;cout<<"copy "<<this<<原创 2012-09-27 16:14:10 · 1679 阅读 · 0 评论 -
父类与子类、继承关系总结
一、父类与子类1.父类与子类的相互转换派生类的对象可以赋给基类,反之不行基类的指针可以指向派生类,反之不行基类的引用可以初始化为派生类的对象,反之不行派生类指针必须强制转换为基类指针后才可以指向基类基类指针转换为派生类指针容易导致崩溃性错误虚基类的引用或派生不能转换为派生类class father{};class son:public father{}原创 2012-01-17 15:17:23 · 21772 阅读 · 0 评论 -
地址、内存、堆、栈总结
一、地址1.对于32位的操作系统,地址都是32位的,前0不可以省略例:int *p = NULL;cout2.指针可以通过内存地址直接访问数据,可避免在程序中复制大量的代码。因此指针效率最高例:a[j]:a+j a[i][j]:a[i]+j二、内存1.数据在内存中的存放形式1)栈区:由编译器自动分配和释放原创 2012-01-14 18:00:01 · 1934 阅读 · 1 评论 -
类的声明、定义与初始化
一、类的声明1.不完全类只声明而尚未定义的类称为不完全类不完全类只能用于定义指针、引用、参数类型、返回值类型,不能定义对象class Mat; //求定义的类Mat Test(Mat& B);//正确Mat *pMat;//正确Mat mt;//错误,如果在任何位置(即使是在这句话的后面)定义了这个类,这句就是正确的二、类的定义1.常用关键字(1)type原创 2012-01-05 09:46:24 · 5365 阅读 · 1 评论 -
友元friend总结
1.关键字friend只出现在类定义的内部(这点与const不同)2.友元是授予友元关系的那个类的成员3.定义类B为类A的友元,B可以访问A的私有成员例1:/*要注意友元的使用顺序,声明B->定义A->定义B*/ class B;/*只声明而未定义的类称为不完全类,可用定义类型,不能用于定义对象*/ class A { private: int x原创 2012-01-11 14:28:49 · 1847 阅读 · 0 评论