C++ STL之命名空間、函數模板、類模板

1 命名空間


#include <iostream.h>
//using namespace std;

namespace name1
{
	int max(int a,int b)
	{
		int result= a>b? a:b;
		return result;
	}
}


namespace name2
{
	int max(int a,int b)
	{
		int result= a>b? a:b;
		cout<<"the max is "<<result<<endl;
		return result;
	}

}

using namespace name1;
using namespace name2;

int main()
{

	cout<<name2::max(10,20)<<endl;
	return 0;
} 

注意點:
1、main函數前可以不加
using namespace name1;
using namespace name2;
那麼,使用name1或name2下的函數(或類)時,就必須在函數前 加 作用域

2、頭文件一樣不能省
但一般使用using namespace name1這樣的語句來聲明 函數、類的原型



2 函數模板
代碼:
#include <iostream.h>
#include <stdlib.h>
#include <string.h>


template <class T>
T max(T a,T b)
{
	T result= a>b? a:b;
	return result;
}

/*
float max(float a,float b)
{
	float result= a>b? a:b;
	return result;
}

char max(char a,char b)
{
	char result= a>b? a:b;
	return result;
}*/


int main()
{
	
	//cout<<max('d','c')<<endl;
	cout<<max(100,167)<<endl;


	return 0;
} 



知識點:
1、函數參數,如果是 字符串-------實際上是  char *
2、strcmp
	字符串的比較函數------C語言
	比較的是 2個字符串的 ASCII
	靠返回值來判斷誰大 誰小
	a-b
3、比較漢字的大小
	實際上比較的是漢字的 GBK編碼 大小
	但該編碼順序,剛好和 新華字典 順序一致--------根據拼音
	
4、如果調用某個函數時,發現,既有 函數模板,也有 普通函數------------普通函數 優先級高,首先調用	

#include <iostream.h>
#include <stdlib.h>
#include <string.h>




template <class T>
T max(T a,T b)					//這是函數模板,優先級低,因此當調用max("李四","張三")時,實際調用的是不是該函數模板
{								//在mian中調用max('d','e')時,沒有普通函數,因此該函數模板被實際調用
	T result= a>b? a:b;
	return result;
}


char * max(char * a,char * b)	//這是普通函數,優先級高,因此當調用max("李四","張三")時,實際調用的是本函數
{
	char * result;
	int flag=strcmp(a,b);
	if(flag>=0)
	{
		result=a;
	}
	else
	{
		result=b;
	}
	return result;
}

/*
float max(float a,float b)
{
	float result= a>b? a:b;
	return result;
}

char max(char a,char b)
{
	char result= a>b? a:b;
	return result;
}*/




int main()
{
	
	//cout<<max('d','e')<<endl;
	cout<<max("李四","張三")<<endl;   //GBK  GB2312
	return 0;
} 





類模板

例子:將CStudent類,改造爲1個 類模板
改造步驟:
1、將普通類的 int 改爲 T
2、在 類聲明前加 template <class T>
3、在 成員函數定義前加 template <class T>
4、在 成員函數定義中:作用域後加 <T>
5、在main函數中,定義CStudent類的對象時,在類名後加 <int>-------當number爲int時
										 在類名後加 <char *>----當number爲char *時(即,學號可以爲字符串,如"First"、"Second")
										 
										 



#include <iostream.h>
#include <stdlib.h>
#include <string.h>

template <class T>
class CStudent
{
public:
	T number;
	char *name;
	CStudent(T number,char *name);

};

template <class T>
CStudent<T>::CStudent(T number,char *name)
{
	this->number=number;
	this->name=new char[strlen(name)+1];
	strcpy(this->name,name);
}




int main()
{
	CStudent<int> stu1(1001,"zhangsan");
	CStudent<char *> stu2("first","lisi");
	cout<<stu2.number<<"   "<<stu1.name<<endl;  
	return 0;
} 

	

3 string
優點:
1、可代替  char *
2、像數組,裏面也有元素,且元素類型爲 char
3、是 動態數組----即,數組元素可以任意添加和刪除,而數組大小會動態進行增大或減小
4、可以直接進行賦值運算,而且是 深複製,不需要使用new和strcpy進行賦值了
5、可以直接使用cin cout
6、使用+可以進行字符串的連接
 
#include <iostream>
#include <string>

using namespace std;


int main()
{	

	string str1="zhangsan";
	//char *str1="zhangsan";
	//char str1[]="zhangsan";
	cout<<str1<<endl;
	cout<<"請輸入1個字符串:";
	cin>>str1;
	cout<<"您輸入的是:"<<str1<<endl;

	return 0;
}  
		

例子:---------在CStudent類中,使用string來代替char *
//Student.h
#include <string>
using namespace std;

class CStudent  
{
public:
	int number;
	string name;
	CStudent();
	CStudent(int number,string name);
	void print_student();
	virtual ~CStudent();

};


//Student.cpp
CStudent::CStudent(int number,string name)
{
	this->number=number;
	this->name=name;
}

void CStudent::print_student()
{
	cout<<number<<"  "<<name<<endl;
	return;
}


//main.cpp
#include <iostream>
#include <string>
#include "Student.h"

using namespace std;

int main()
{	
	CStudent stu1(1001,"zhangsan");
	stu1.name=stu1.name+" hello";
	stu1.print_student();
	return 0;
} 






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