C++学习笔记day41-----C++98-引用在函数形参中的使用,C++中的类型转换,C++编程习惯建议,类和对象,类的定义和实例

引用设计出来,可以让函数间传递参数的时候,效率更高。
由于引用自身没有实体,和引用的绑定的目标使用同一块内存,这就让函数在传递大的数据的实参的时候,不需要多余的空间。在时间和空间上都进行了节省。
左值
–>普通变量
–>赋值表达式返回结果 = += -= …–>前++、–
右值
–>常量、字面值
–>大多数表达式结果、包括后++、–
–>正常情况下**,函数的返回值(临时变量/将亡右值)
3 引用函数参数
1) 可以将引用用于函数的参数,这时形参就是实参的别名,可以通过形参直接修改实参变量的值;同时还可以避免参数值的传递,减小函数调用的开销,提高代码执行效率
2) 引用型的参数有可能意外修改实参,如果不希望修改实参本身,可以将形参定义为常引用,在提高传参效率的同时还可以允许接受常量型的实参

4 引用参数返回值
1) 可以将函数的返回值声明为引用,可以避免返回值所带来的内存开销
2) 如果一个函数返回值类型是引用,那么该函数返回值可以是一个左值
int &func(void){
static int a = 100;
return a;
}
func() = 100;//ok
注:不要从函数中返回局部变量的引用,因为所引用的目标会在函数返回以后被回收,使用很危险!但是可以返回成员变量、静态变量、全局变量。

1) 从C角度看引用实现本质就是指针,但是C++开发中,建议多使用引用,而不是指针。
int num = 100;
int &rnum = num;
int *const pnum = #
rnum <=等价=> *pnum;
2) 指针可以不做初始化,其指向目标可以修改(指针常量除外),而引用必须初始化,而且一旦初始化其引用的目标不能在修改。
eg:
int a = 10,b = 20;
int *p_num;
p_num = &a;
p_num = &b;
//int &r_num;//error
int &r_num = a;
r_num = b;//赋值,而不是修改引用的目标

3) 可以定义指针的指针(二级指针),但是不能定义引用的指针
eg:
int a = 100;
int *p_a = &a;
int **pp_a = &p_a;

int &r_a = a;
int &*p_r_a = &r_a;//error
int *p_r_a = &r_a;//success,普通的指针

4) 可以定义指针的引用(给指针变量起别名),但是不能定义引用的引用
int a = 100;
int *p = &a;
int *&r_p = p;//ok

int &r_a = a;
int &&rr_a = r_a;//error
int &rr_a = r_a;//ok,普通引用

5) 可以定义指针数组,但是不能定义引用数组
eg:
int a = 1, b = 2, c = 3;
int *parr[3] = {&a,&b,&c};//ok
int &rarr[3] = {a,b,c};//error
6) 定义数组引用
int arr[3] = {1,2,3};
int (&rarr)[3] = arr;//ok
7) 和函数指针类似,也可以定义函数引用,其语法使用和函数指针类似:
eg:
void func(int a,double d){…}
int main(void){
void (*pf)(int, double) = func;//函数指针
pf(10,3.14);
void (&rf)(int, double) = func;//函数引用
rf(10,3.14);
}

十一、类型转换
1 隐式类型转换
eg:
char c = ‘a’;
int i = c;//隐式
—————–
void foo(int i){…}
foo(c);//隐式
—————–
int bar(void){
char c = ‘a’;
return c;
}
—————–

2 显式类型转换
2.1 C++兼容C中强制转换
char c = ‘a’;
int i = (int)c;//显式,C风格
int i = int(c);//C++风格
2.2 C++增加了四种操作附形式的显式转换
1) 静态类型转换
语法:
目标类型变量 = static_cast<目标类型>(原类型变量)
使用场景:
用于将void*转换为其他类型的指针

2) 动态类型转换
目标类型变量 = dynamic_cast<目标类型>(原类型变量)

3) 常类型转换
目标类型变量 = const_cast<目标类型>(原类型变量)
适用场景:
用于去除一个指针或者引用的常属性
const_cast.cpp

4) 重解释类型转换
语法:
目标类型变量 = reinterpret_cast<目标类型>(原类型变量)
适用场景:
–>任意类型指针或引用之间的转换
–>在指针和整型数之间直接转换
eg:向物理内存0x12345678地址存放数据100;
int paddr = reinterpret_cast< Int >(0x12345678);
*paddr = 100;

小结:C++之父给C语言程序员的建议
1、慎用宏,使用const、enum、inline替换
\#define PAI 3.14
const double PAI = 3.14;
enum status{SLEEP,RUN,STOP};

#\define max(a,b) ((a)>(b)?(a):(b))

inline int max(int a,int b){
return a > b ? a : b;
}
2、变量随用随声明同时初始化
3、尽量使用new/delete来取代C中的malloc/free
4、少用void*、指针计算,联合体,强制转换
5、尽量使用string表示字符串,少用C风格char*/char[]
\=============================================================

十二、类和对象
1、 什么是对象
万物皆对象,任何一种事物都可以看作是对象。

2、 如何的描述和表达对象
通过对象的属性(名词、数量词、形容词)和行为(动词)来描述对象。

3、 面向对象的程序设计
对自然世界中对象的描述引入到编程实践的一种理念和方法,这种方法成为“数据抽象”,在描述对象时,细节的东西脱离,只考虑一般性(共性),规律性,统一性的方面。

4、 什么是类
类是将多个对象共性提取出来定义的一种,新的数据类型,是对对象属性和行为的抽象描述。

十三、类的定义和实例化
1、 定义类的语法一般形式
class/struct 类名:继承方式 基类 …{
访问控制变量符:
类名(形参表):初始化表{//函数体} //构造函数
~类名(void){函数体} //析构函数
返回类型 函数名(形参表){函数体} //成员函数
数据类型 变量名;//成员变量
};

猜你喜欢

转载自blog.csdn.net/displaymessage/article/details/80487090
今日推荐