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