引用
将引用 参数声明为常量数据的引用的理由有三个:
- 使用const可以避免无意中修改数据的编程错误;
- 使用const使函数能够处理const和非const实参,否则将只能接受非const数据;
- 使用const引用使函数能够正确生成并使用临时变量;
临时变量是指:
double refcube(const double &ra)
{
return ra*ra*ra;
}
long edge=5L;
double size=3.0;
double c1=refcube(edge); //edge的类型不是double,编译器会生成一个临时匿名变量,并让ra指向他。
double c2=refcube(size+7.0); //size+7.0 虽然类型正确,但是没有名字,编译器也会生成一个临时变量;
这些临时变量只在函数调用期间存在,
参数传递
对于传递值而不修改函数:
数据对象 | 参数传递的类型 |
---|---|
数据对象小,如内置数据类型 | 值传递 |
数组 | 指针,并声明为const |
较大的结构 | 使用const或const引用 |
类对象 | const引用 |
对于修改调用函数中数据的函数:
数据对象 | 参数传递的类型 |
---|---|
内置数据类型 | 指针 |
数组 | 指针 |
类对象 | 引用 |
默认参数
对于带参数列表的函数,必须从右向左默认添加值
函数重载
在函数执行相同的任务,但使用不同形式的数据才采用函数重载;
函数重载的关键在于函数的参数列表,也称为函数特征标。与函数的返回类型无关;
c++允许定义相同的函数,条件是他们的特征标不同。如果参数数目或参数类型,排列顺序不同,则特征标也不同。
函数模板
如果需要多个将同一种算法用于不同类型的函数,就使用模板
关键字为template ,typename/class[在c++98之前,使用class来创建模板]
示例:
template <typename anyType>
void swap(anyType &a,anyType &b)
{
anyType temp;
temp=&a;
a=b;
b=temp;
}
重载的模板
模板可以像函数一样重载,并非所有的模板参数都必须是模板参数类型
template <typename anyType>
void swap(anyType &a,anyType &b);
template <typename anyType>
void swap(anyType *a,anyType *b,int n);
链接性
- 外部链接性 :可在其他文件中访问
- 内部链接性 : 只能在当前文件中访问 (静态全局变量)
- 无链接性 :只能在当前函数或代码块中访问
5中变量存储方式
存储描述 | 持续性 | 作用域 | 链接性 | 如何声明 |
---|---|---|---|---|
自动 | 自动 | 代码块 | 无 | 在代码块中 |
寄存器 | 自动 | 代码块 | 无 | 代码块中,使用关键字register |
静态,无链接性 | 静态 | 代码块 | 无 | 在代码块中,使用关键字static |
静态,外部链接性 | 静态 | 文件 | 外部 | 不在任何函数内 |
静态,内部链接性 | 静态 | 文件 | 内部 | 不在任何函数内,使用关键字static |
静态变量 默认初始化为0
- volatile
表明程序代码没有对内存单元进行修改,其值也可能发生变化。
该关键字的作用是为了改善编译器的优化能力。 - mutable
指出即使结构或类变量为const,某个成员也可以被修改
Const成员函数
将const关键字放在函数括号的后面
void show () const;
void stock::show() const;
this指针
this指针指向用来调用成员函数的对象
每个成员函数(包括构造函数与析构函数)都有一个this指针,this指针指向调用对象。如果需要引用整个调用对象,可以使用表达式*this。