C++ 從C++介紹到函數的重載

第一次寫博客 不足地方望指出 小生會不斷改進學習爭取做到 “好”

初級篇

0.1C語言與C++的不同

0.1.1“實用性”增強
C語言變量都必須在作用域開始的位置定義!
C++更加“使用”所有變量都可以在使用時在定義。

0.1.2變量檢測增強
//C語言允許多個重名的全局變量,因爲它們指向的是同一塊內存區域
//C++則不允許定義多個重名全局變量 不允許這種二義性

0.1.3struct類型增強
C語言不認爲struct是新類型
C++則認爲struct是新類型

0.1.4C++中所有變量和函數必須要有類型

0.1.5C++中新增bool類型(布爾類型)的關鍵字
bool只佔一個字節
bool類型返回值:
true
false

0.1.6三目運算符功能增強

#include<iostream>
using namespace std;
int main()
{
	int a = 30;
	int b = 10;
	//(a < b ? a : b) = 40;//返回給較小數 並將40返回給它
	//cout << "a = " << a << "b =  " << b << endl;
	int c = (a < b ? a : b);//將小值返回給c
	                        //三目運算符是一個表達式,表達式不能做左值
	cout << "c = " << c << endl;
	return 0;
}

C語言返回變量的值C++語言返回的是變量本身
C語言返回的是變量值不能作爲左值使用 c++中的三目運算符直接返回的是變量本身因此可以出現在程序的任何地方

注意:三目運算符可能返回的值中如果有一個是常量值,則不能作爲左值

使用
(a < b ? 1 : b )= 40;
C語言如何支持類似C++的特性呢?
當左值的條件:要有內存空間;C++編譯器幫助程序員取了一個地址而已

0.1.7const
在C++中const對於宏的定義可以直接到函數中,這大大加強了代碼的可讀性,減少了BUG;
Const與#define的異同

相同:
C++中const修飾的是真正的常量,而不是C中的只讀。在這裏的const 與#define相同。

不同:
1) 對於宏的定義格式
const int c = 7; #define c 5
2) C++中的const常量與宏定義不同
const常量是由編譯器處理的,提供類型檢查和作用域檢查
宏定義由預處理器處理,單純的文本替換
C++中的Const常量:
可能分配空間也可能不分配
一般情況下不分配
但是
const被作用於全局當被其他文件使用時會開闢新空間
被取地址是開闢新空間
當const int& a = 10;做引用時會開闢新空間

1.1關鍵字

1.2命名空間(namespace)

引入空間名關鍵字namespace,爲了更好的控制標識符的作用域

當使用頭文件 < iostream >時,該頭文件並沒有定義全局命名空間,必須使用 namespace std 才能使用cout 和 cin

命名空間的作用:解決命名的衝突

格式:namespace name
{
變量/函數
}

1.2.1 C++命名空間的使用:

使用整個命名空間:using namespace name;
使用命名空間中的變量:using name::variable;
使用默認命名空間中的變量:::variable
默認情況下可以直接使用默 認命名空間中的所有標識符
命名空間可以鑲嵌命名空,在同一個工程可以允許多個相同命名空間

namespace  N
{
   int a = 10 ;
}
int a = 20;
int main()
{
int a = 30;
print(“%d\n”,a);//打印出的是局部變量的a
print(“%d\n”,: :a); //打印出的是全局變量的a
print(“%d\n”,N::a); //打印出的是命名空間N中的a
return 0;
}

namespace的三種選擇使用:
直接指定標識符。
如:

print(“%d\n”,: :a); //打印出的是全局變量的a
print(“%d\n”,N::a); //打印出的是命名空間N中的a

2)使用using關鍵字: using 空間名 :: 變量名
缺陷:不能有相同的變量

namespace N
{
	int i = 10;
}

using N::i;
int main()
{
	//printf("%d\n", ::i);
	printf("%d\n",i);//不能允許其他相同命名的變量
	return 0;
}

3)使用 using namespace 空間名

using namespace N;
int main()
{
	//printf("%d\n", ::i);
int i = 1;   //(衝突已命名空間限定符引用來解決)
printf("%d\n", ::i);

	printf("%d\n",i);
	return 0;
}

1.2.2C語言與C++命名空間的差異

C中的命名空間
在C語言中只有一個全局作用域
C語言中所有的全局標識符共享同一個作用域
標識符之間可能發生衝突

C++中的命名空間
命名空間將全局作用域分成不同的部分
不同命名空間中的標識符可以同名而不會發生衝突
命名空間可以相互嵌套
全局作用域也叫默認命名空間

1.3C++輸入&輸出(cout, cin)

使用之前必須要使用:(聲明)

#include<iostream>
using namespace std;
輸入:   cin>>變量;  

輸出:  cout<<a<<endl;

如:

#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
	//printf("%d\n", ::i);
	//printf("%d\n",i);
	int a = 0;
	cin >> a ;
	cout << i <<"     "<<a<< endl;
	return 0;
}

1.4缺省數參

缺省參數的使用方式
沒有參數則使用默認
有則使用傳的參數‘’

如下代碼中有全缺省參數和半缺省數

void Test(int a = 1 ,int b = 1, int c = 1)//全缺省參數
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}
//void Test1(int a, int b = 1, int c)//錯誤的示範,最右邊必須帶值
void Test1(int a , int b = 1, int c = 1)//半缺省參數,從右往左看必須
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}
int main()
{
	Test(12, 13, 14);
	Test(14);
	Test();
	Test1(12, 13, 14);
	Test1(14);
	//Test1();//若爲半缺省參數   缺省的參數必須傳值
	
	//printf("%d\n", ::i);
	//printf("%d\n",i);
	//int a = 0;
	//cin >> a ;
	//cout << i <<"     "<<a<< endl;
	return 0;
}
int add( int a, int = 0)佔位參數 實際作用僅僅是爲了佔位
{
     return 0;
}

  1. 半缺省參數必須從右往左依次來給出,不能間隔着給
  2. 缺省參數不能在函數聲明和定義中同時出現

//void Test(int a = 1, int b = 1, int c = 1);// 缺省參數不能在函數聲明和定義中同時出現>>>一般放在
//聲明中指出
void Test(int a = 1 ,int b = 1, int c = 1)//全缺省參數

注意:

  1. 半缺省參數必須從右往左依次來給出,不能間隔着給
  2. 缺省參數不能在函數聲明和定義中同時出現
  3. 缺省值必須是常量或者全局變量
  4. C語言不支持(編譯器不支持)

1.5函數重載

1.5.1函數重載概念

C++允許在同一作用域中聲明幾個功能類似的同名函數,這些同名函數的 形參列表(參數個數 或 類型 或 順序)必須不同,常用來處理實現功能類似數據類型不同的問題(編譯器會根據參數類型進行辨別然後進行編譯)編譯器編譯階段進推演 傳的參數若沒有此類型編譯器就會隱式轉換

namespace ADD 
{

int add(int lift, int right)//重載的時候注意函數類型(函數參數列表)應不同
                      //返回值並不是構成函數重載的原因
                     //函數重載不要使用默認參數
	{
		int sum = lift + right;
		cout << sum << endl;
		return 0;
     }
	double add(double lift, double right)
	{
		double sum = lift + right;
		cout << sum << endl;
		return 0;
	}
	char add(char lift, char right)
	{
		char sum = lift + right;
		cout << sum << endl;
		return 0;
	}

}
using namespace ADD;
int main()
{
	add(10, 20);
	add(10.2, 10.4);//參數類型一定要給正確
	add('1', '2');
   //add(‘1’,10);//錯誤
	return 0;
}

函數的重載與函數返回值是否相同沒有關係

單參函數和無參函數最好不要一起出現

1.5.2名字修飾

這個很重要:
這裏需要注意的是因爲編譯器在底層對函數進行編譯的時候實際將函數名進行重新修飾,使之成爲一個比較複雜的名字。這個名字中包含了:函數名以及參數類型。這就是爲什麼函數的重載要求其參數列表不同,只有參數列表不同的情況下編譯器在進行重新修飾後,才能保證這個名字在底層的全局唯一性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章