C++ 基礎 1:C++ 對 C 語言的加強

namespace 命名空間

C++ 命名空間的定義

C++標準 引入了關鍵字 namespace(命名空間),能夠更好地控制標識符的做用域。ios

namespace name
{
      ...
}

C++ 命名空間的使用方法

std 是 C++標準命名空間,C++標準程序庫中的全部標識符都被定義在 std 中,好比標準庫中的類 iostream、vector 等,使用時要加上 using 聲明(using namespace stdusing 指示(std::string、std::vector<int>編程

  • 使用整個命名空間:using namespace name;函數

  • 使用命名空間中的變量:using name::variable;spa

  • 使用默認命名空間中的變量:::variable指針

頭文件 <iostream> 和 <iostream.h> 的區別

<iostream> 和 <iostream.h> 二者是兩個文件,裏面的代碼也不同。早期的 C++ 實現將標準庫功能定義在全局空間裏,聲明在 <iostream.h> 中。code

C++ 標準爲了和 C 區別開來,也爲了正確使用命名空間,規定頭文件不使用後綴.h。所以,blog

  1. 當使用 <iostream.h> 時,至關於在 C 中調用標準庫函數,使用的是全局命名空間,也就是早期的 C++ 實現。繼承

  2. 當使用 <iostream> 時,該頭文件沒有定義全局命名空間,必須使用 namespace std,才能正確的使用標準庫函數如 cout。內存

C 和 C++ 中的命名空間的區別

C 中的命名空間作用域

  • 在 C 語言中只有一個全局做用域

  • C 語言中全部的全局標識符共享同一個做用域

  • 標識符之間可能發生衝突

C++ 中的命名空間

  • 命名空間將全局做用域分紅不一樣的部分

  • 不一樣命名空間中的標識符能夠同名而不會發生衝突

  • 命名空間能夠相互嵌套

  • 全局做用域也叫默認命名空間

C++ 命名空間編程實踐

// naspaceTest.cpp,本代碼驗證 namespace 做用域
// C 語言頭文件,C++ 兼容 C 語言
#include<stdio.h>

namespace namespaceA
{
	int variable = 0;
}

namespace namespaceB
{
	int variable = 1;

	namespace namespaceC
	{
		int variable;

		struct infoStruct
		{
			char name[10];
			int age;
		};
	}
}

int main(void)
{
	using namespace namespaceA;

	printf("namespaceA variable = %d\n",variable);	//0

	printf("namespaceB variable = %d\n",namespaceB::variable);	//1

	namespaceB::namespaceC::variable = 2;

	printf("namespaceC variable = %d\n",namespaceB::namespaceC::variable);	//2

	namespaceB::namespaceC::infoStruct info = {"Pika",16};
	
	printf("namespaceC.info.name = %s\n",info.name);	//Pika
	printf("namespaceC.info.age = %d\n",info.age);	//16

	getchar();

	return 0;
}

運行結果:

變量定義位置

C 語言:在較老的 C89/C90 標準(ANSI C標準)下,變量只能在程序的開頭定義,或者說變量定義的前面不能有其餘非聲明或非定義的語句。

好比在 VC++6.0 或者 VS2010 下編譯如下代碼時:

// varDefTest.c,本代碼驗證在較老的 C89/C90 標準(ANSI C標準)下,變量定義位置
# include <stdio.h>
int main(void)
{
    int i;
    i = 1;
    int j = 2;  //這句是錯誤的,由於在它前面有一個給變量 i 賦值的非定義語句
    return 0;
}

會提示下面的錯誤:

error C2143: 語法錯誤 : 缺乏「;」(在「類型」的前面)

可是這種寫法在 .cpp 文件(C++ 源文件)中是容許的,C++ 容許在程序的任意位置定義變量

全局變量重複定義檢測

在 C 語言中,容許重複定義多個同名的全局變量,多個同名的全局變量最終會被連接到全局數據區的同一個地址空間上,即全局變量會取最後一個被賦予的值,以下所示:

// globalValTest.c,本代碼驗證在 C 語言中,容許重複定義多個同名的全局變量
#include <stdio.h>

int global_val;

int global_val = 1;

int main()
{
	printf("global_val = %d\n",global_val);

	return 0;
}

運行結果:

C++ 中不容許定義多個同名的全局變量,以下所示:

// globalValTest.cpp,本代碼驗證在 C++ 中不容許定義多個同名的全局變量
#include <iostream>

using namespace std;

int global_val;
int global_val = 1;

int main(int argc, char *argv[])
{
        cout << "global_val = " << global_val << endl;

	return 0;
}

運行結果:

struct 類型

C 中的 struct 只能是一些變量的集合體,能夠封裝數據卻不能夠隱藏數據,並且成員不能夠是函數。

C++ 中的 struct 能夠看成 class 來用,在標準 C++ 中,struct 和 class 有兩個區別:

  1. struct中的成員默認是 public 的,class 中的默認是 private 的。

  2. 在用模版的時候只能寫 template 或 template 不能寫 template

此外,若是沒有多態和虛擬繼承,在 C++ 中,struct 和 class 的存取效率徹底相同。

若是不是爲了和 C 兼容,C++ 中就不會有 struct 關鍵字。所以建議是:若是不須要與C兼容或傳遞參數給C程序,不要在 C++ 中用 struct

C++ 相較 C 更增強類型,任意位置的程序元素都必須顯式指明類型

C 語言中,默認類型包括如下狀況:

  • 若是沒有明確寫出函數返回類型,函數返回類型默認爲 int 類型。

    例:function(int arg); ,表示返回值爲 int ,接受一個 int 類型參數的函數。

  • 若是沒有明確寫出函數參數類型,函數參數默認爲 int 類型。

    例:int function(arg); ,表示返回值爲 int ,接受一個 int 類型參數的函數。

  • 若是沒有明確寫出函數參數,則該函數能夠接受任意參數。

    例:int function(); ,表示返回值爲 int,接受任意參數的函數。

C 語言中的默認類型在 C++ 中是不合法的。

在 C++ 中,int function();int function(void) 具備相同的意義,都表示返回值爲 int 的無參函數。

新增 bool 類型關鍵字

C++ 在 C 語言的基本類型上增長了 bool 類型,bool 類型只有 true(非0),false(0)兩個值。

三目運算符功能加強

C 語言中的三目運算符返回的是變量的值,不能做爲左值使用。

C++ 中的三目運算符可直接返回變量自己,所以能夠出如今程序的任何地方。

但三目運算符可能返回的值中若是有一個是常量,則不能做爲左值使用,如:(a<b?1:b) = 30;

const 加強

C++ const關鍵字小結

const 關鍵字用來定義常量。

常量是固定值,在程序執行期間不會改變。這些固定的值,又叫作字面量。

const 修飾普通類型的變量

const int CONST_A = 1;      // 常整型數 CONST_A

int const CONST_B = 2;      // 常整型數 CONST_B

int c = CONST_A;            // 正確

CONST_A =  3;               // 編譯器會報錯,給常量賦值是不被容許的

能夠將 常整型數 CONST_A 賦值給 整型變量 c,可是不能給 常整型數 CONST_A 再次賦值。對一個常量賦值是不被容許的,常量的值不容許修改。

const 修飾指針變量

const int *CONST_P_C = 1;     // CONST_P_C是一個指向常整型數的指針(它所指向的內容不能被修改,可是指針指向的內存地址能夠修改)

int test = 61;

*CONST_P_C = 0;      // 編譯器不容許,報錯

CONST_P_C = &test;   // 正確


int* const CONST_P_D = 2;     // CONST_P_D是一個常指針(指針指向的內存地址不能被修改,可是它所指向的內容能夠被修改)

*CONST_P_C = 0;      // 正確

CONST_P_C = &test;   // 編譯器不容許,報錯


const int * const CONST_P_E = &test;   // CONST_P_E是一個指向常整型數的常指針(指針指向的內存地址和她所指向的內容,均不能被修改)

const 和 #define 的區別

const 常量是由編譯器處理的,提供類型檢查和做用域檢查。

#define由預處理器處理,單純的文本替換。

C 語言和 C++ 中的 const 區別

C 語言中的 const 變量

C 語言中的 const 變量是隻讀變量,有本身的存儲空間

C++ 中的 const常量

  • 可能分配存儲空間,也可能不分配存儲空間

  • 當 const 常量爲全局時,而且須要在其餘文件中使用,會分配存儲空間

  • 當須要使用 & 操做符,取 const 常量的地址時,會分配存儲空間

  • const int &a = 10; ,即 const 修飾引用時,也會分配存儲空間

對 enum 枚舉的檢測加強

C 語言中枚舉的本質就是 int,枚舉變量能夠用任意 int 賦值。但 C++ 中,只能用被枚舉出來的元素賦值,以下所示:

// enumTest.cpp,本代碼驗證 枚舉

#include <iostream>
using namespace std;

enum sex{girl,boy};

int main()
{
	enum sex testSex = girl;
        
        testSex = 0; // 錯誤,可是 C 語言能經過
        
        testSex = boy;  

        cout << "testSex = " << testSex << endl; // 1      

	return 0;
}
相關文章
相關標籤/搜索