1. 程式人生 > >C++與C的語法區別1

C++與C的語法區別1

CPP  cin

//#include<stdlib.h>//C風格
#include<cstdlib>
#include<iostream>

using namespace std;

void main1()
{
	//char str[20] = { "tasklist & pause" };//C風格
	char str[20]{ "tasklist&pause" };//CPP風格
	system(str);

	cin >> str;//輸入
	system(str);
}

void main()
{
	int num;
	double db;
	char ch;
	cin >> num >> db >> ch;
	cout << num << db << ch << endl;//結束並換行
	//cin  cout泛型

	system("pause");
}
強弱型別
#include<iostream>

void main()
{
	int num = 100;
	int *p1 = #
	//char *p2 = p1;//無法從int轉換為char
	//CPP型別檢測嚴格,精準  強型別程式語言

	//int *p2 = p1;//C語言風格
	int *p2(p1);//CPP寫法   ()代表初始化
}
using
#include<iostream>

namespace run1
{
	int x = 10;
}
namespace run2
{
	int x = 20;
}
void run()
{
	using namespace std;//等同於區域性變數
	cout << "hello";
	using namespace run1;
	using namespace run2;
	//cout << x;//不明確
}



void main()
{
	std::cout << "hello" << std::endl;
	//std::cout << run2::x << std::endl;//或者下面的寫法
	using run2::x;//只因用名稱空間的一個變數或函式
	std::cout << x << std::endl;

	std::cin.get();
}
函式的過載和模板函式
#include<iostream>
#include<cstdlib>
using namespace std;

//add CPP函式過載
//int add(int a, int b)
//{
//	return a + b;
//}
//char add(char a, char b)
//{
//	return a + b;
//}
//double add(double a, double b)
//{
//	return a + b;
//}

//函式模板的意義  通用,泛型  呼叫的時候編譯,不呼叫不編譯
template<class T>//模板函式,原生函式優先於模板函式,強行呼叫模板add<int>(1,2)制定型別
T add(T a, T b)
{
	return a + b;
}

void main1()
{
	cout << add(1,2) << endl;//3
	cout << add('1', '2') << endl;//c
	system("pause");
}

模板介面
#include<iostream>

using namespace std;

void show(int num)
{
	cout << num << endl;
}
void show1(int num)
{
	cout << num +1 << endl;
}
void show2(double num)
{
	cout << num + 1 << endl;
}

template<class T>//把show函式也變成模板
void showit(T num)
{
	cout << num << endl;
}

//泛型介面,任何資料型別,傳遞函式指標
template<class T,class F>
void run(T t, F f)
{
	f(t);
}

void main()
{
	run(10, show);//10
	run(10, show1);//11
	run(10.1, show2);//11.1

	run("abc", showit<const char*>);//showit模板函式
	//介面,嚴格型別
	cin.get();
}

型別一致可變引數模板

#include<iostream>
#include<cstdarg>//包含可變引數
using namespace std;

template<class T>
T add(int n, T t...)//第一個代表多少個引數,第二個,多個型別
{
	cout << typeid(T).name() << endl;
	va_list arg_ptr;//開頭的指標
	va_start(arg_ptr, n);//從arg_ptr開始讀取n個數
	T res(0);//初始化為0
	for (int i = 0; i < n; i++)
	{
		res += va_arg(arg_ptr, T);//根據資料型別取出資料
	}
	va_end(arg_ptr);//結束讀取
	return res;
}

void main()
{
	cout << add(4, 1, 2, 3, 4) << endl;
	cout << add(5, 1, 2, 3, 4, 5) << endl;
	cout << add(5, 1.1, 2.2, 3.3, 4.4, 5) << endl;

	cin.get();
}


型別不一致可變引數模板
#include<iostream>
#include<cstdarg>//包含可變引數
using namespace std;

void show()//用來結束遞迴
{

}
//引數型別不一致,個數不確定  typename   class 都代表型別
template<typename T,typename...Args>//typename...Arge可變引數
void show(T t, Args...args)//Args...args  C++巨集定義,可變引數的型別
{
	cout << t << endl;
	show(args...);//遞迴
}

void main1()
{
	show(1, 1.2, 'a', "123");
	cin.get();
}