-Introduction:类成员函数的参数是 常规/指针/引用 都有什么区别
(1) 参数内容作为常规出现的时候代表了一种拷贝构造函数
(2) 参数内容作为指针出现的时候代表了一种aggregation的关系,使用最为便捷
- 由于指针的灵活性还有不需要立刻赋值的特点,也导致其使用比较频繁
- 这里所说的灵活性是指指针可以随时更换指向的对象
(3) 参数内容作为引用出现的时候代表了一种composition的关系,需要立刻初始化
- 由于具备了不需要拷贝的特点,其高效性导致使用较为频繁
引用型内容初始化的一些注意事项
(1). 当类中数据成员是引用型数据成员,该如何初始化 (int& a)
- 初始化列表。 A(int b) : a(b) 的方式初始化
- 特点:并不具备引用的特点,修改其中一方并不会导致另一方的变化
(2). 当函数参数是引用型数据,该如何代入数据 function(int &c)
- 直接代入。 function(c)
- 特点:有引用的特点,在函数里修改c会导致c的变化
(3). 当函数参数是引用型对象,该如何代入现有对象 function(A& a)
- 直接代入。 function(a)
- 当时看到有function(&d)的用法,以为是引用的时候要加上&号,其实加上&是因为
- d被初始化成了一个常规型对象,但是function定义的是要用指针型对象作为参数
- 因此这里的本意其实是取地址的意思
Const类型有必要单独拿出来说一下,因为摆放的位置很多,不同的位置对应着不同的含义
- 函数类型 - Const 型函数
- 类成员函数拥有const类型,const可以放在两处位置:声明首,与声明末尾
1. const int function(){ ... }
例如const int 这个代表所返回的函数值是const int类型的数据
2. function () const { ... }
这个函数不能修改类中的数据,但是对应的,只有类成员函数才可以这么写,非类成员,常规函数无法
使用这个特性
//注意,这个不只代表"类数据"无法修改,不保证函数形参能不能修改
//也就是说,只在"类函数"末尾加上const,"函数参数"可以修改,"类数据"不能修改
函数参数 - Const 类型的形参 * <-犯过错误这里*
1. function ( const int& u )
形参中加上const字样,代表函数参数无法修改
也就是以上的int u是无法修改的
(1). 相比于函数类型const只能应用于类函数,这种const类型参数可以应用于类函数+常规函数
(2). 函数调用的时候,填入的内容 : "常量变量" "临时赋值数据" "类对象",请看以下 :
(1).A(const int &a) --实现-> A(3) 3被临时标记为常量整数 -->不报错
(2).A(const int &a) --实现-> int y = 5 ; A(y) --> 不报错,y被临时转换成const类型
(3).A(const string &a) --实现-> string a ; A(a) --> 不报错,类型临时转换
但是,但hai...有的就是不能临时转换
(4). A(const string* &a) --实现-> string* a = new string ; A(a) -->但是这就是报错
//因为在声明里说了会用const类型的指针,但是你没用,此外,我们也没给它自动类型转换
const string* a = new string ; 套用正确
Summary: (1)//确定只有临时数据 或者 常规数据(非指针) 或者 类对象数据会传过来
就可在形参前面加上const关键字
(2) 但是指针是没法转换的,而且也没人用const指针,涉及指针传过来,就不要在形参里加上const
- 类的数据成员 - Const类型的数据
1.声明: Const int a;
2.初始化: A(b): a(b);
初始化列表的方式初始化一个const数据,方式等同于引用型数据成员
3.调用: const类型的数据成员必须被const类型的函数成员调用,常规类型的函数成员无法调用
//但是const类型的函数成员,除了可以调用const类型数据成员,还能调用其他类型的数据
- Const类型的initializer_list 因为ini_list比较特殊,单独说一下
initializer_list与const函数参数一致,都是const initializer_list<int> target
const的类函数 + const参数 报错引用实例
void function (const A &a) { ... }
void function_1 () const {
function (this) //正确版本,编译通过
}
但是以下就不通过