C++基础
来源:互联网 发布:php require once地址 编辑:程序博客网 时间:2024/05/16 16:02
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;cout<
- C #基础
- c基础
- C基础
- c基础
- C 基础
- c基础
- C基础
- c基础
- C基础
- C基础
- C基础
- c基础
- C 基础
- c基础
- C基础
- C#基础
- C基础
- C基础
- POJ2081
- 今天在CentOS6.4操作系统下安装了Oracle客户端
- 循环队列的基本用法(链式存储结构)
- Ubuntu 12.04(64位)安装Android Studio 全过程
- linux grep命令详解
- C++基础
- 自学宝典:10个学习Android开发的网站推荐
- 电信141p123第36题
- JAVA中给 JPanel 加标题头
- 机房重构——总结篇
- 杭电ACM——1088
- js中在子窗口中关闭父窗口问题
- FDU--- (bfs+dfs 未完待补充)
- 提高第18课时,实践1,数组大作战