您的位置:首页 > 编程语言 > C语言/C++

c++简记—程序设计基本要素

2017-02-27 14:07 274 查看
2.11 标识符
标识符中字符可以是字母、数字或下划线,但是标识符的首字符必须是字母或下划线,而不能是数字。在c++语言中,标识符是区分大小写的。此外,标识符不能与c/c++的关键
字同名。
2.13 常量
所谓常量是指其值不能改变的量。常量只能在定义时进行被初始化,用户在程序中不能够使用赋值语句来修改常量值。在旧版的C语言中,使用宏定义来实现。例如 #define PI
3.1415926 使用宏定义的缺点是在预处理时不能进行类型检查,而且不能获得PI的地址。 定义常量需要使用const关键字。例如 const double PI=3.1415926; 此外,在定义
函数时,如果在函数体中不需要修改参数值,建议将参数的类型定义为常量,这样,当用户不小心在函数体内修改了参数值,编译器将提示错误信息。
2.14 变量
每个变量包含两个方面内容,一是变量的数据值,即变量内存存储区域中的数据,另一个是变量的地址值,即变量的内存存储区域的地址。
变量的初始化还可以使用括号的形式来实现 例如:int nSum(100);
在c++中,每种内置的数据类型提供了一个特殊的构造函数,可以将对象初始化为0.例如:int nSum=int();//使用构造函数来初始化变量。
2.15 寄存器变量
寄存器变量用于“建议”编译器将变量放置在CPU的寄存器中,用于加快访问速度。使用register关键字定义。例如:register int nSum=100;
对于寄存器变量,程序中不能获得变量的地址,也不能成为全局变量或静态变量,但是它可以作为函数的形式参数。
2.16 静态变量
变量按照作用范围的不同可以划分为局部变量和全局变量。
局部变量是指在函数内定义的变量,在函数调用结束后,局部变量将消失。而全局变量是指在函数体外定义的变量,它的生命周期随着程序的结束而结束。
静态变量主要是针对局部变量的,如果定义一个静态的局部变量,它的生命周期在函数结束后会依然存在,在下次调用函数时,会依然保存上一次函数调用结束之后的值。而且,
对于静态变量只执行一次初始化(无论函数调用多少次)。在c++中,静态变量是使用static关键字定义的。例如:static int s_nSum=100;
全局变量不仅能够在当前文件中被使用,还可以在其他文件中被使用。但是全局静态变量则不同,它的作用是当前定义全局静态变量处到当前文件结束,不能够在其他文件中访
问全局静态变量。
4.2.2 const参数在编写函数时,有些情况下不需要用户修改函数值。例如:设计一个输出数值的函数。函数有一个函数参数,由于函数的作用是输出数值,因此在函数内部不
需要修改参数。为了在语法上防止用户修改参数值,可以将参数定义为const参数,即常量参数。
例如:
void OutputNumber(const int nNumber)
{
cout<<nNumber<<endl;
}
4.2.3 指针/引用参数
在c++中,函数参数主要采用两种传递方式:值传递和引用传递。所谓值传递是指在调用函数时将实际参数复制一份传递到参数中,这样,在函数中如果对参数进行修改,将不会影响到实际参数;而引用传递是指在调用函数时将实际参数的地址传递到函数中,那么,在函数中对参数所进行的修改,将;影响到实际参数。
例如按引用传递:
void OutputNumber(int &nNumber)
{
cout<<nNumber<<endl;
nNumber=20;
}
int main(int argc,char * argv[])
{
int nNum=10;
OutputNumber(nNum);
cout<<nNum<<endl;
return 0;
}
在OutputNubmer函数中将形式参数nNumber设置为20,实际参数nNumber的值也是20.因为引用传递,传递的是参数的地址,对nNumber的修改自然会影响到nNum.
4.31 重载函数
(1)函数的返回值类型不作为区分重载函数的一部分。
(2)对于普通的函数参数来说,const关键字不作为区分重载函数的标识。但是如果参数的类型是指针或引用类型,则const关键字将作为重载函数的标识。
(3)参数的默认值不作为区分重载函数的标识。如:bool Validate(int nData=20) bool Validate(int nData);
(4)使用typedef自定义类型不作为重载的标识。即当函数使用了typedef自定义的类型作为参数类型时,如果另一个函数的参数类型与自定义类型的原始参数类型相同,则函数的重载是非法的。例如typedef int INT; bool Validate(INT x) bool Validate(int x)
4.5 函数指针
在为函数指针赋值时,编译器能够将函数名转换为函数的地址,因此语句"funOutput=&OutputNumber;"可以改写为"funOutput=OutputNumber",其作用是相同的。同理,在使用函数指针调用函数时,语句"(*funOutput)(10);"也可以改写为"funOutput(10);",编译器能够进行隐式转换。
4.6 函数模版
template定义函数模版,尖括号<>表示模版函数,模版函数主要有两种,一种是模版类型函数,一种是模版非类型参数。例如:
template<class type>
type Add(type Plus,type Summand)
{
return Plus+Summand;
}
上述代码中定义的模版使用的模版类型使用关键字class或typename开始,其后是一个用户定义的合法的标识符type。模版非类型参数与普通参数定义相同,它通常为一个常数。
调用函数模版类型有:
int nRet=Add(100,200);
double nRet=Add(100.4,200.4);
但如果写成 int nRet=Add(100,200.4)或 double nRet=Add(100,200.4)是错误的。因为传递了两个类型不同的参数,编译器产生了歧义.
如果用户在调用函数模版时显示标识模版类型,就不会出现错误了。例如:
int nRet=Add<int>(100,200.3);
double nRet=Add<double>(100,200.5);
4.6.2 重载函数模版
在介绍函数时讨论了具有相同名称但不同参数的函数,这样的函数被称为重载函数。同样,如果具有相同名称但不同参数的函数模版,称之为重载函数模版。例如:
template<class type>
type Add(type Plus,type Summand){
return Plus+Summand;
}
template<class type>
type Add(type Array[],int nLen){
type tRet=0;
for(int i=0;i<nlen;i++){
tRet+=Array[i];
}
return tRet;
}
int main(int argc,char* argv[]){
int nRet=Add(100,200);
cout<<"整数之和:"<<nRet<<endl;
int nArray[5]={1,2,3,4,5};
int nSum=Add(nArray,5);
cout<<"数组元素之和:"<<nSum<<endl;
return 0;
}
4.7.3 定义命名空间
如果使用命名空间中的对象,需要在对象前使用命名空间前缀。在定义命名空间时,通常在头文件中声明命名空间中的函数,在源文件中定义命名空间中的函数。将程序的声明与实现分开。
File文件和目录路径名的抽象表示形式。
用户界面和操作系统使用与系统相关的路径名字符串来命名文件和目录。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: