C++中的值初始化和默认初始化
1、值初始化
??????顧名思義,就是用數(shù)值初始化變量。如果沒有給定一個初始值,就會根據(jù)變量或類對象的類型提供一個初始值。對于int類型其值初始化后的值為0。
2、默認(rèn)初始化:如果定義變量時沒有指定初值,則變量被默認(rèn)初始化。其初始值和變量的類型以及變量定義的位置相關(guān)。默認(rèn)初始化類對象和默認(rèn)初始化內(nèi)置類型變量有所不同。
對于默認(rèn)初始化內(nèi)置類型變量來說:
??????1)定義在函數(shù)體之外的變量是全局變量,一般存儲在全局區(qū),存儲在全局區(qū)的變量一般會執(zhí)行值初始化。此時,其初始值和變量的類型有關(guān)。對于int類型其初始值為0,對于char類型其默認(rèn)初始值為' '。例子如下:
#include <iostream>
?
using namespace std;
?
int i;
double d;
char c;
?
int main()?
{
?? ?cout << "i = " << i << endl;
?? ?cout << "d = " << d << endl;
?? ?cout << "char" << c << "char" << endl;
?
?? ?system("pause");
?? ?return 0;
}
在VS2015中編譯結(jié)果如下:
?
??????2)定義在函數(shù)體內(nèi)部的是局部變量,其存儲在棧區(qū)中,如果沒有指定初值,那么該局部變量將不會被初始化,也就是說這個局部變量的值是未定義的,是個隨機值。此時,如果不給這個局部變量賦值,那么就不能使用該局部變量,否則就會出錯,注意這種情況是沒有被初始化,既沒有使用默認(rèn)初始化也沒有使用值初始化,沒有初始化的值是不能使用的。例子如下:
#include <iostream>
?
using namespace std;
?
int main()?
{
?? ?int i;
?? ?cout << "i = " << i << endl;
?
?? ?system("pause");
?? ?return 0;
}
在VS2015中編譯結(jié)果如下:
對于默認(rèn)初始化類對象來說:不僅在創(chuàng)建類對象時,要使用默認(rèn)構(gòu)造函數(shù),而且類成員要沒有類內(nèi)初始值,類才會執(zhí)行默認(rèn)初始化。
??????如果是自定義的默認(rèn)構(gòu)造函數(shù),不進(jìn)行任何操作或者是編譯器合成的默認(rèn)構(gòu)造函數(shù),其成員變量經(jīng)過默認(rèn)初始化之后的初始化值和局部變量的初始值是一樣的,即是隨機值,但是可以使用(類普通成員變量也存在棧區(qū))。例子如下:
#include <iostream>
#include <string>
?
using namespace std;
?
class Init?
{
public:
?? ?int getA()?
?? ?{
?? ??? ?return a;
?? ?}
?? ?double getD()
?? ?{
?? ??? ?return d;
?? ?}
?? ?char getC()
?? ?{
?? ??? ?return c;
?? ?}
?? ?string getStr()
?? ?{
?? ??? ?return str;
?? ?}
?
private:
1、值初始化
??????顧名思義,就是用數(shù)值初始化變量。如果沒有給定一個初始值,就會根據(jù)變量或類對象的類型提供一個初始值。對于int類型其值初始化后的值為0。
2、默認(rèn)初始化:如果定義變量時沒有指定初值,則變量被默認(rèn)初始化。其初始值和變量的類型以及變量定義的位置相關(guān)。默認(rèn)初始化類對象和默認(rèn)初始化內(nèi)置類型變量有所不同。
對于默認(rèn)初始化內(nèi)置類型變量來說:
??????1)定義在函數(shù)體之外的變量是全局變量,一般存儲在全局區(qū),存儲在全局區(qū)的變量一般會執(zhí)行值初始化。此時,其初始值和變量的類型有關(guān)。對于int類型其初始值為0,對于char類型其默認(rèn)初始值為' '。例子如下:
#include <iostream>
?
using namespace std;
?
int i;
double d;
char c;
?
int main()?
{
?? ?cout << "i = " << i << endl;
?? ?cout << "d = " << d << endl;
?? ?cout << "char" << c << "char" << endl;
?
?? ?system("pause");
?? ?return 0;
}
在VS2015中編譯結(jié)果如下:
?
??????2)定義在函數(shù)體內(nèi)部的是局部變量,其存儲在棧區(qū)中,如果沒有指定初值,那么該局部變量將不會被初始化,也就是說這個局部變量的值是未定義的,是個隨機值。此時,如果不給這個局部變量賦值,那么就不能使用該局部變量,否則就會出錯,注意這種情況是沒有被初始化,既沒有使用默認(rèn)初始化也沒有使用值初始化,沒有初始化的值是不能使用的。例子如下:
#include <iostream>
?
using namespace std;
?
int main()?
{
?? ?int i;
?? ?cout << "i = " << i << endl;
?
?? ?system("pause");
?? ?return 0;
}
在VS2015中編譯結(jié)果如下:
對于默認(rèn)初始化類對象來說:不僅在創(chuàng)建類對象時,要使用默認(rèn)構(gòu)造函數(shù),而且類成員要沒有類內(nèi)初始值,類才會執(zhí)行默認(rèn)初始化。
??????如果是自定義的默認(rèn)構(gòu)造函數(shù),不進(jìn)行任何操作或者是編譯器合成的默認(rèn)構(gòu)造函數(shù),其成員變量經(jīng)過默認(rèn)初始化之后的初始化值和局部變量的初始值是一樣的,即是隨機值,但是可以使用(類普通成員變量也存在棧區(qū))。例子如下:
#include <iostream>
#include <string>
?
using namespace std;
?
class Init?
{
public:
?? ?int getA()?
?? ?{
?? ??? ?return a;
?? ?}
?? ?double getD()
?? ?{
?? ??? ?return d;
?? ?}
?? ?char getC()
?? ?{
?? ??? ?return c;
?? ?}
?? ?string getStr()
?? ?{
?? ??? ?return str;
?? ?}
?
private:
?? ?int a;
?? ?char c;
?? ?double d;
?? ?string str;
};
?
int main()?
{
?? ?Init init;
?? ?
?? ?cout << "a = " << init.getA() << endl;
?? ?cout << "d = " << init.getD() << endl;
?? ?cout << "ccc" << init.getC() << "ccc" << endl;
?? ?cout << "str" << init.getStr() << "str" << endl;
?
?? ?system("pause");
?? ?return 0;
}
在VS2015中編譯結(jié)果如下:
對于string類型的成員變量是個空串,這可能和string類的內(nèi)部實現(xiàn)有關(guān)。
3、默認(rèn)初始化的出現(xiàn)場景。
?????1)當(dāng)我們在塊作用域內(nèi)不使用任何初始值定義一個非靜態(tài)變量或者數(shù)組時。數(shù)組和非靜態(tài)變量它們的值都是隨機值,但是數(shù)組可以使用,而非靜態(tài)變量需要在賦值以后才能使用。例子如下;
#include <iostream>
?
using namespace std;
?
int main()
{
?? ?int a[5];
?
?? ?for (int i = 0; i < 5; i++)
?? ?{
?? ??? ?cout << "數(shù)組元素值為:" << a[i] << endl;
?? ?}
?
1、值初始化
??????顧名思義,就是用數(shù)值初始化變量。如果沒有給定一個初始值,就會根據(jù)變量或類對象的類型提供一個初始值。對于int類型其值初始化后的值為0。
2、默認(rèn)初始化:如果定義變量時沒有指定初值,則變量被默認(rèn)初始化。其初始值和變量的類型以及變量定義的位置相關(guān)。默認(rèn)初始化類對象和默認(rèn)初始化內(nèi)置類型變量有所不同。
對于默認(rèn)初始化內(nèi)置類型變量來說:
??????1)定義在函數(shù)體之外的變量是全局變量,一般存儲在全局區(qū),存儲在全局區(qū)的變量一般會執(zhí)行值初始化。此時,其初始值和變量的類型有關(guān)。對于int類型其初始值為0,對于char類型其默認(rèn)初始值為' '。例子如下:
#include <iostream>
?
using namespace std;
?
int i;
double d;
char c;
?
int main()?
{
?? ?cout << "i = " << i << endl;
?? ?cout << "d = " << d << endl;
?? ?cout << "char" << c << "char" << endl;
?
?? ?system("pause");
?? ?return 0;
}
在VS2015中編譯結(jié)果如下:
?
??????2)定義在函數(shù)體內(nèi)部的是局部變量,其存儲在棧區(qū)中,如果沒有指定初值,那么該局部變量將不會被初始化,也就是說這個局部變量的值是未定義的,是個隨機值。此時,如果不給這個局部變量賦值,那么就不能使用該局部變量,否則就會出錯,注意這種情況是沒有被初始化,既沒有使用默認(rèn)初始化也沒有使用值初始化,沒有初始化的值是不能使用的。例子如下:
#include <iostream>
?
using namespace std;
?
int main()?
{
?? ?int i;
?? ?cout << "i = " << i << endl;
?
?? ?system("pause");
?? ?return 0;
}
在VS2015中編譯結(jié)果如下:
對于默認(rèn)初始化類對象來說:不僅在創(chuàng)建類對象時,要使用默認(rèn)構(gòu)造函數(shù),而且類成員要沒有類內(nèi)初始值,類才會執(zhí)行默認(rèn)初始化。
??????如果是自定義的默認(rèn)構(gòu)造函數(shù),不進(jìn)行任何操作或者是編譯器合成的默認(rèn)構(gòu)造函數(shù),其成員變量經(jīng)過默認(rèn)初始化之后的初始化值和局部變量的初始值是一樣的,即是隨機值,但是可以使用(類普通成員變量也存在棧區(qū))。例子如下:
#include <iostream>
#include <string>
?
using namespace std;
?
class Init?
{
public:
?? ?int getA()?
?? ?{
?? ??? ?return a;
?? ?}
?? ?double getD()
?? ?{
?? ??? ?return d;
?? ?}
?? ?char getC()
?? ?{
?? ??? ?return c;
?? ?}
?? ?string getStr()
?? ?{
?? ??? ?return str;
?? ?}
?
private:
?? ?int a;
?? ?char c;
?? ?double d;
?? ?string str;
};
?
int main()?
{
?? ?Init init;
?? ?
?? ?cout << "a = " << init.getA() << endl;
?? ?cout << "d = " << init.getD() << endl;
?? ?cout << "ccc" << init.getC() << "ccc" << endl;
?? ?cout << "str" << init.getStr() << "str" << endl;
?
?? ?system("pause");
?? ?return 0;
}
在VS2015中編譯結(jié)果如下:
對于string類型的成員變量是個空串,這可能和string類的內(nèi)部實現(xiàn)有關(guān)。
3、默認(rèn)初始化的出現(xiàn)場景。
?????1)當(dāng)我們在塊作用域內(nèi)不使用任何初始值定義一個非靜態(tài)變量或者數(shù)組時。數(shù)組和非靜態(tài)變量它們的值都是隨機值,但是數(shù)組可以使用,而非靜態(tài)變量需要在賦值以后才能使用。例子如下;
#include <iostream>
?
using namespace std;
?
int main()
{
?? ?int a[5];
?
?? ?for (int i = 0; i < 5; i++)
?? ?{
?? ??? ?cout << "數(shù)組元素值為:" << a[i] << endl;
?? ?}
?
?? ?system("pause");
?? ?return 0;
}
在VS2015下編譯結(jié)果如下:
????2)當(dāng)一個類本身含有類類型的成員且使用合成的默認(rèn)構(gòu)造函數(shù)時。使用合成的默認(rèn)構(gòu)造函數(shù)那么該類和其類類型成員都會執(zhí)行默認(rèn)初始化。
????3)當(dāng)類類型的成員沒有在構(gòu)造函數(shù)初始值列表中顯示地初始化時。說明該類類型成員會調(diào)用默認(rèn)構(gòu)造函數(shù)。
4、值初始化的出現(xiàn)場景
????1)在數(shù)組初始化的過程中如果我們提供的初始值數(shù)量少于數(shù)組的大小時,剩余的為提供初始值部分就會執(zhí)行值初始化。
#include <iostream>
?
using namespace std;
?
int main()
{
?? ?int a[5] = {1, 2, 3};
?
?? ?for (int i = 0; i < 5; i++)
?? ?{
?? ??? ?cout << "數(shù)組元素值為:" << a[i] << endl;
?? ?}
?
?? ?system("pause");
?? ?return 0;
}
在VS2015下編譯結(jié)果如下:
由結(jié)果可知,沒有提供初始值的數(shù)組元素按照值初始化為了0。
????2)當(dāng)我們不使用初始值定義一個局部靜態(tài)變量時。因為是靜態(tài)的,所以該局部靜態(tài)變量不再存儲在棧區(qū),而是存儲在全局區(qū)。此時,就會根據(jù)類型進(jìn)行設(shè)置該變量的初始值,即值初始化。例子如下:
#include <iostream>
?
using namespace std;
?
int main()
{
? ? static int a;
?? ?static char c;
?
?? ?cout << "a:" << a << endl;
?? ?cout << "ccc" << c << "ccc" << endl;?? ?
?
?? ?system("pause");
?? ?return 0;
}
VS2015編譯結(jié)果為:
????3)當(dāng)我們通過書寫形如T()的表達(dá)式顯示請求值初始化時,其中T是類型名(vector的一個構(gòu)造函數(shù)只接受一個實參用于說明vector的大小),它就是使用一個這種形式的實參來對它的元素初始器繼續(xù)值初始化)。
?
===》》》對于默認(rèn)初始化,可以參考《C++ primer》P40頁
===》》》對于值初始化,可以參考《C++ primer》P88頁
===》》》對于默認(rèn)初始化和值初始化的發(fā)生場景,可以參考《C++ primer》P262頁
===》》》對于合成的默認(rèn)構(gòu)造函數(shù),可以參考《C++ primer》P235頁
點贊 4
————————————————
版權(quán)聲明:本文為CSDN博主「flychildc」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/J_H_C/article/details/83589282
?? ?system("pause");
?? ?return 0;
}
在VS2015下編譯結(jié)果如下:
????2)當(dāng)一個類本身含有類類型的成員且使用合成的默認(rèn)構(gòu)造函數(shù)時。使用合成的默認(rèn)構(gòu)造函數(shù)那么該類和其類類型成員都會執(zhí)行默認(rèn)初始化。
????3)當(dāng)類類型的成員沒有在構(gòu)造函數(shù)初始值列表中顯示地初始化時。說明該類類型成員會調(diào)用默認(rèn)構(gòu)造函數(shù)。
4、值初始化的出現(xiàn)場景
????1)在數(shù)組初始化的過程中如果我們提供的初始值數(shù)量少于數(shù)組的大小時,剩余的為提供初始值部分就會執(zhí)行值初始化。
#include <iostream>
?
using namespace std;
?
int main()
{
?? ?int a[5] = {1, 2, 3};
?
?? ?for (int i = 0; i < 5; i++)
?? ?{
?? ??? ?cout << "數(shù)組元素值為:" << a[i] << endl;
?? ?}
?
?? ?system("pause");
?? ?return 0;
}
在VS2015下編譯結(jié)果如下:
由結(jié)果可知,沒有提供初始值的數(shù)組元素按照值初始化為了0。
????2)當(dāng)我們不使用初始值定義一個局部靜態(tài)變量時。因為是靜態(tài)的,所以該局部靜態(tài)變量不再存儲在棧區(qū),而是存儲在全局區(qū)。此時,就會根據(jù)類型進(jìn)行設(shè)置該變量的初始值,即值初始化。例子如下:
#include <iostream>
?
using namespace std;
?
int main()
{
? ? static int a;
?? ?static char c;
?
?? ?cout << "a:" << a << endl;
?? ?cout << "ccc" << c << "ccc" << endl;?? ?
?
?? ?system("pause");
?? ?return 0;
}
VS2015編譯結(jié)果為:
????3)當(dāng)我們通過書寫形如T()的表達(dá)式顯示請求值初始化時,其中T是類型名(vector的一個構(gòu)造函數(shù)只接受一個實參用于說明vector的大小),它就是使用一個這種形式的實參來對它的元素初始器繼續(xù)值初始化)。
?
===》》》對于默認(rèn)初始化,可以參考《C++ primer》P40頁
===》》》對于值初始化,可以參考《C++ primer》P88頁
===》》》對于默認(rèn)初始化和值初始化的發(fā)生場景,可以參考《C++ primer》P262頁
===》》》對于合成的默認(rèn)構(gòu)造函數(shù),可以參考《C++ primer》P235頁
點贊 4
————————————————
版權(quán)聲明:本文為CSDN博主「flychildc」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/J_H_C/article/details/83589282
?? ?int a;
?? ?char c;
?? ?double d;
?? ?string str;
};
?
int main()?
{
?? ?Init init;
?? ?
?? ?cout << "a = " << init.getA() << endl;
?? ?cout << "d = " << init.getD() << endl;
?? ?cout << "ccc" << init.getC() << "ccc" << endl;
?? ?cout << "str" << init.getStr() << "str" << endl;
?
?? ?system("pause");
?? ?return 0;
}
在VS2015中編譯結(jié)果如下:
對于string類型的成員變量是個空串,這可能和string類的內(nèi)部實現(xiàn)有關(guān)。
3、默認(rèn)初始化的出現(xiàn)場景。
?????1)當(dāng)我們在塊作用域內(nèi)不使用任何初始值定義一個非靜態(tài)變量或者數(shù)組時。數(shù)組和非靜態(tài)變量它們的值都是隨機值,但是數(shù)組可以使用,而非靜態(tài)變量需要在賦值以后才能使用。例子如下;
#include <iostream>
?
using namespace std;
?
int main()
{
?? ?int a[5];
?
?? ?for (int i = 0; i < 5; i++)
?? ?{
?? ??? ?cout << "數(shù)組元素值為:" << a[i] << endl;
?? ?}
?
?? ?system("pause");
?? ?return 0;
}
在VS2015下編譯結(jié)果如下:
????2)當(dāng)一個類本身含有類類型的成員且使用合成的默認(rèn)構(gòu)造函數(shù)時。使用合成的默認(rèn)構(gòu)造函數(shù)那么該類和其類類型成員都會執(zhí)行默認(rèn)初始化。
????3)當(dāng)類類型的成員沒有在構(gòu)造函數(shù)初始值列表中顯示地初始化時。說明該類類型成員會調(diào)用默認(rèn)構(gòu)造函數(shù)。
4、值初始化的出現(xiàn)場景
????1)在數(shù)組初始化的過程中如果我們提供的初始值數(shù)量少于數(shù)組的大小時,剩余的為提供初始值部分就會執(zhí)行值初始化。
#include <iostream>
?
using namespace std;
?
int main()
{
?? ?int a[5] = {1, 2, 3};
?
?? ?for (int i = 0; i < 5; i++)
?? ?{
?? ??? ?cout << "數(shù)組元素值為:" << a[i] << endl;
?? ?}
?
?? ?system("pause");
?? ?return 0;
}
在VS2015下編譯結(jié)果如下:
由結(jié)果可知,沒有提供初始值的數(shù)組元素按照值初始化為了0。
????2)當(dāng)我們不使用初始值定義一個局部靜態(tài)變量時。因為是靜態(tài)的,所以該局部靜態(tài)變量不再存儲在棧區(qū),而是存儲在全局區(qū)。此時,就會根據(jù)類型進(jìn)行設(shè)置該變量的初始值,即值初始化。例子如下:
#include <iostream>
?
using namespace std;
?
int main()
{
? ? static int a;
?? ?static char c;
?
?? ?cout << "a:" << a << endl;
?? ?cout << "ccc" << c << "ccc" << endl;?? ?
?
?? ?system("pause");
?? ?return 0;
}
VS2015編譯結(jié)果為:
????3)當(dāng)我們通過書寫形如T()的表達(dá)式顯示請求值初始化時,其中T是類型名(vector的一個構(gòu)造函數(shù)只接受一個實參用于說明vector的大小),它就是使用一個這種形式的實參來對它的元素初始器繼續(xù)值初始化)。
?
===》》》對于默認(rèn)初始化,可以參考《C++ primer》P40頁
===》》》對于值初始化,可以參考《C++ primer》P88頁
===》》》對于默認(rèn)初始化和值初始化的發(fā)生場景,可以參考《C++ primer》P262頁
===》》》對于合成的默認(rèn)構(gòu)造函數(shù),可以參考《C++ primer》P235頁
點贊 4
————————————————
版權(quán)聲明:本文為CSDN博主「flychildc」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/J_H_C/article/details/83589282
總結(jié)
以上是生活随笔為你收集整理的C++中的值初始化和默认初始化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++构造函数之委托构造函数
- 下一篇: C++之error: cannot bi