日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++中的值初始化和默认初始化

發(fā)布時間:2024/4/18 c/c++ 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中的值初始化和默认初始化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。