- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
前言:
找工作需要,最近看了下一些 C++的基本概念,为范磊的《零起点学通 C++》,以下是一些笔记。
内容:
delete p;只是删除指针 p 指向内存区,并不是删除指针 p,所以 p 还是可以用的。删除空指针所指向内存是可以的。
堆中的变量和对象时匿名的,没有名称,只能通过指针来访问。
在堆中创建对象时,在分配内存的同时会调用类的构造函数,在删除堆中对象时,会调用类 的析构函数。
为了避免内存泄露,在删除一个指针后应该将其其值赋为 0。
常量指针是指针指向的内存区域地址不能改变,但是该内存地址里保存的值是可以改变的, 比如 int a; int * const p = a;
指向常量的指针表示指针指向的对象是不能被修改的,但是该指针可以被修改,即该指针可 以指向另一块目标内存地址。比如 const int a = 0; const int *p = a; 如果 A 是一个类, 也可以为 const A* p = new A;
而指向常量的常指针表示指针本身不能被修改,其指向的内存地址内容也不能被修改。比如
const int a = 0; const int * const p = a;
引用就是别名常量。
堆中的地址是用指针来操作的,用不到别名。
如果在 main 函数前面的其它函数的声明和定义是一起的,则表明这个函数是内联函数!因此当该函数较长时,应该将声明和定义分开。
可以通过指针或引用来返回多个值,因为返回机制只能返回一个值,所以其它的返回值当做参数来传入,通过引用或指针。如果按值传递时,对象很大,则系统开销会很大(比如对象传入 和返回,要创建 2 次临时对象,因此也会多次调用构造函数和析构函数),此时,一般采用按地址传递或按引用传递。
既然引用实现了指针的功能,而且使用起来更加方便,为什么还要指针呢?
这是因为指针可以为空,但是引用不能为空,指针可以被赋值,但是引用只可以被初始化, 不可以被赋为另一个对象的别名。如果你想使用一个变量来记录不同对象的地址,那么就必须使用指针,另外指针也可以是多重的。
指针可以指向堆中空间,引用不能指向堆中空间。但指针和引用可以一同使用,另外要注意 引用的生命周期。
对于引用而言,如果引用是一个临时变量,那么这个临时变量的生存周期不会小于这个引用 的生存期。指针不具备这个特性。
为了避免内存泄露,我们不能按值的方式返回一个堆中对象,而必须按地址或者别名的方式 返回一个别名或者内存地址,这样就不会调用复制构造函数来创建一个该对象的副本了,而是直 接将该对象的别名或者地址返回。
为了避免指针混淆,我们必须对堆中的内存在哪个函数中创建,就在哪个函数中释放。如果函数名相同,函数参数的个数也相同,只是参数的类型不同,则也可以是函数重载。 如果函数有缺省值,则在调用时该参数可以不传入,这样相当于函数个数少了。
默认参数其实也可以看做是一种函数重载,但默认参数的函数如果不加标注的话很容易被忽 略,而且容易被有参数的同名函数覆盖。而通常的重载函数使用方便,易于理解。具有默认参数 的重载的是参数的数值,而重载函数重载的是参数的类型。
我可以对构造函数的函数头对常量和引用进行初始化,此时的初始化顺序是按照成员列表的 顺序进行的,而不是按构造函数头赋值的顺序。而析构顺序恰好相反。
一般情况下,编译器会自动为类生成一个默认的复制构造函数。 清楚构造函数和 new 的结合,析构函数和 delete 的结合。
构造函数是不能设置为私有的。
默认的构造函数是浅层的构造函数,如果类中的成员变量有指针的话,就很有可能出现内存 泄露的错误,因此此时需要使用深层的构造函数。
用已有对象来创建对象时,才会调用复制构造函数。如果复制符左侧是已有对象,右侧也是 已有对象,则不会调用复制构造函数,而是调用一个赋值运算符函数。
只要创建一个类,编译器就会自动添加 4 个函数:构造函数,析构函数,复制构造函数, 赋值运算符函数,其中系统默认的复制构造函数和复制运算符都属于浅层拷贝。
默认的自加重载运算符为前置自加运算符。
可以通过创建一个无名的临时对象来完成重载自加后的对象赋值操作。当然了,较好的方法 是返回*this 指针,这样就不需要建立一个临时对象了,不过它依旧会调用赋值运算符,为了避免这种情况,可以将重载自加函数返回值类型设为返回对象的引用。
重载后置自加运算符时,为了区分与前置自加的区别,需要添加一个毫无意义的参数,这个 参数只是在编译器中使用到,在函数体中没用。
在一条语句中自加运算符的执行顺序为从右向左,且不同的编译器入栈的顺序不同,比如说
VC6.0 中其入栈是要求该语句的表达式执行完后。因此 a=1;couta++++a;则分别输出的是 2,2;
++的结合性为右
文档评论(0)