标签:
MyClass c; //对象 一定在栈上
MyClass* pc; //指针 要问自己是栈指针,还是堆指针
MyClass& c2 = c; //引用 要问自己是栈引用,还是堆引用
c = *pc; //“解引用” 可指向堆对象,也可以指向栈对象
pc = &c; //“取地址”
堆引用
MyClass* pc2 = new MyClass();
MyClass& c3 = *pc2;
三种传参方式
//对象
void func1(MyClass c) {
}
//指针
void func2(MyClass* pc) {
}
//引用
void func3(MyClass& mc) {
}
一个原则:谁分配谁释放
MyClass* pc = new MyClass();
func2(pc);
delete pc;
一个荒谬的做法,违反谁分配谁释放
void func3(MyClass& mc) {
MyClass* p = &mc;
delete p;
}
const引用是by value的替代品,const引用可以禁止引用修改原对象值
void func3(const MyClass& mc) {
}
三种传参方式,是否调用拷贝构造函数
MyClass c1;
func1(c1); //调用拷贝构造
func2(&c1); //不调用拷贝构造函数
func3(c1); //不调用拷贝构造函数
三种返回值方式分析
MyClass func1() {
MyClass c1;
return c1;
//下面的方式会造成内存泄露,违反“谁创建,谁释放”。
MyClass* pc2 = new MyClass();
return *pc2;
}
MyClass* func2() {
//函数返回后c1被销毁。
MyClass c1;
return &c1;
//内存泄露
MyClass* pc2 = new MyClass();
return pc2;
}
MyClass& func3() {
//函数返回后c1被销毁。
MyClass c1;
return c1;
//内存泄露
MyClass* pc2 = new MyClass();
return *pc2;
}
MyClass& c4 = func3();
delete &c4;
传进函数的地址,可以再返回去。
MyClass& func4(MyClass& c) {
return c;
}
一种编程语言能不能只有栈而没有堆?
不行,栈是静态的,编译时就确定。堆是动态的。
一种编程语言能不能只有堆而没有栈?
不行,没有栈就没有函数。
版权声明:本文为博主原创文章,未经博主允许不得转载。
极客班GeekBand - C++第一次课程辅导 - 李建忠
标签:
原文地址:http://blog.csdn.net/lionpku/article/details/47059299