制作企業(yè)網(wǎng)站的新聞顯示重慶百度競價開戶
1、new 關(guān)鍵字 會在堆內(nèi)申請空間,如果僅僅是普通調(diào)用構(gòu)造函數(shù),不會在堆內(nèi)開辟空間。
2、函數(shù)調(diào)用會形成棧幀,進行壓棧操作,函數(shù)調(diào)用結(jié)束,會進行彈棧。
函數(shù)內(nèi)的局部對象,會隨著彈棧,而被銷毀(析構(gòu))。
所以,不要返回局部變量的地址,沒有意義,這塊地址內(nèi)的數(shù)據(jù)已經(jīng)隨著函數(shù)結(jié)束而回收,該指針指向棧區(qū)的未知空間。
3、new 會調(diào)用構(gòu)造函數(shù),malloc不會
4、引用類型使用時一定要進行初始化,不可以修改引用的指向,但是可以通過引用修改引用指向數(shù)據(jù)的值。
int a = 10;
int b = 20;
int& a_r = a; //引用使用前要被初始化a_r = b; //這是賦值操作,不是更改引用 把a的值改變了錯誤:
&a_r = b; //這才是修改引用cout <<"a_r: " << a_r <<" a :" <<a << endl; //結(jié)果都是20
國內(nèi)教材大多數(shù)理解為,引用是一個變量的新名稱,用來替代數(shù)據(jù)的舊名。但是在大多數(shù)C++編譯器中,引用實際上就是?一個指針常量。
TypeName data;?
TypeName & var_ref =? data;? //引用初始化
TypeName?const * var_ptr? =& data, //指針常量初始化
var_ref 等同于var_ptr
//以下操作是非法的
TypeName =data_new;
&var_ref= data_new;
var_ptr=&data_new;
指針常量的特性就是 可以改變指針指向數(shù)據(jù)本身的值,但是不能修改指針的指向。
#include<iostream>
#include <string>
using namespace std;class Example {public:int age;Example(int age) :age(age){cout << "Example 有參構(gòu)造" << endl; }Example():age(9999) { cout << "Example 無參構(gòu)造函數(shù)調(diào)用" << endl; }~Example() { cout <<"age: "<<age << "---析構(gòu)!!" << endl; }
};Example testE1() {Example e(33);//局部對象,函數(shù)結(jié)束時,出棧,對象e被析構(gòu)return e;
}Example& testE2() {Example e(44); //局部對象,同樣會被析構(gòu)return e;
}Example& testE3(Example & e) {e.age = 55;return e; //其實這里返回不返回都無所謂 最好寫成void返回 ,因為修改的是外部對象
}Example& testE4() {//堆空間創(chuàng)建對象,生命周期隨程序結(jié)束而釋放,或者可以手動deleteExample *e= new Example(66); return *e;
}int main() {Example e;
// e=testE1();
// e = testE2();
//e = testE3(e); //引用必須初始化
Example& e_reference = testE4(); //不手動析構(gòu)則不會析構(gòu)
//此外 注意 引用是不可被修改的,本質(zhì)是一個指針常量 Example const *//&e_reference = e;錯誤,引用不能被修改// 這是賦值,不是修改,此處創(chuàng)建了一個匿名對象,age=888, 此句結(jié)束后,構(gòu)造函數(shù)彈棧,該匿名對象會彈棧,
e_reference = Example(888) ;cout << e.age << endl; //9999cout << e_reference.age << endl; //888delete &e_reference; //此時才對 e_reference 進行析構(gòu) //析構(gòu) ereturn 0;
}