c++常用语法

数组引用形参

使用数组引用形参的原因是为了防止数组降价为指针,如果降价为指针,在计算数组长度时就会出问题,如:

#include 
using namespace std;

void PrintArraySize(char arry[20])
{
    cout<<sizeof(arry)<int main(void)
{
    char array[20] = { 0 };

    cout<<sizeof(array);//输出为20
    PrintArraySize(array);//输出4

    return 0;
}

在这里数组array被降价为指针处理了,在将实参array赋值给PrintArraySize函数中形参时,数组被降价处理为指针,相当于void PrintArraySize(char* const arry); 而sizeof(array)计算的是指针变量array的长度
为了防止数组被降价处理为指针,需要使用数组引用形参的方式,如:

#include 
using namespace std;

void PrintArraySize(char (&arry)[20])
{
    cout<<sizeof(arry)<int main(void)
{
    char array[20] = { 0 };

    cout<<sizeof(array);//输出为20
    /* 数组大小成为形参和实参的一部分,编译器会检查形参大小和实参大小是否一致,不一致则会报错 */
    PrintArraySize(array);//输出20

    return 0;
}

const引用

const引用可以用不同类型的对象初始化(只需从一种类型转换成另一种类型),也可以是不可寻址的值,如文字常量。这时使用const修饰的应用会生成一个临时对象
用不可寻址的值进行初始化:

const int &age = 10;//编译器会将它转换为 int tmp = 10; const int &age = tmp;
int &a = 10; /*编译会出现错误的,没有const修饰,不会生成临时对象,因此会出现错误*/

引用在内部存放的是对象的地址,他是对象的别名,对于不可寻址常量,如文字常量,以及不同类型的对象,必须生成一个临时对象,而引用指向这个临时对象。
不同对象之间的赋值:

double d = 2.33;
int i = &d;//会出错,不同类型之间的引用是不允许的
double d = 2.33;
const int &i = d;/* 正确,编译器会这样处理:int tmp = d;//生成临时对象,实现一次类型转换  const int &i = tmp;*/

d = 6.66;
cout<<"i = "<//i = 2,改变d的值并不会影响i的值,i与临时变量tmp绑定

使用const实现函数重载

如果同一作用域内的几个函数的名字相同但是形参列表不同,称之为函数重载
1.const形参引用和非const形参引用实现的函数重载

void func(int a);
void func(const int a);/* 不是函数重载 */
int i = 100;
func(i);//无法判断会调用哪个函数
void func(int& a);
void func(const int& a);/* 是函数重载 */
const int i = 100;
func(i);/* 会选择第二个函数,编译器判断实参是const变量,因为const不能转换成其它类型,所以只能把const对象赋给const对象。const 实参只能传给const形参引用 */
int k = 50;
func(k);/* 编译器会优先选择非const参数的函数 */

2.底层const修饰的形参和非底层const修饰的形参实现函数重载

int func(int *p)
int func(int *const p);/* 并没有实现函数重载 */
int func(int *p)
int func(const int *p);/* 实现函数重载,拥有底层const的实参只能赋值给拥有底层const的形参 */
  1. const实现的函数重载
class A
{
public:
void func(int a);
void func(int a) const;
}

用const修饰的类成员函数有以下特性:
1.不能改变类成员变量,不能访问非const修饰的类成员函数
2.只能被const修饰的类对象、指针、和引用访问,const修饰成员函数的最重要作用就是限制对于const对象的使用
3.const成员函数能够访问对象的const成员,而非const成员函数不能访问const成员

在一个类中定义类成员变量,该类成员变量必须有默认构造函数,否则会编译出错

http://blog.csdn.net/lqlblog/article/details/17473381

你可能感兴趣的:(c++常用语法)