C++ 学习记录3

十 引用(reference)
4 引用型函数参数
1)可以将引用用于函数的参数,这时形参就是实参的别名,可以通过形参直接修饰实参,同时还可以避免参数传递的过程,减小函数的调用开销,提高代码的执行效率
2)引用型参数可能会以外修改实参,如果不希望修改实参,可以将形参声明为常引用,提高传參效率的同时还可以接收常量型的实参。

5 引用型函数返回值
1)可以将函数的返回类型声明为引用,避免函数返回值所带来的内存开销,提高代码效率
2)如果函数返回值结果是一个普通引用,那么该函数的返回值就是一个左值
注:不要从函数中返回局部变量的引用,因为所引用的内存会啊在会在函数返回以后被释放,使用危险,但是可以返回成员变量,静态变量、全局变量的引用
5 引用和指针
1)从C语言角度看待引用,引用本质就是指针,但是在C++中推荐使用引用而不是指针。
int i = 100;
int& ri = i;
int* const pi = &i;
ri <=等价=> pi
2)指针定义时可以不做初始化,其指向目标可以初始化以后再修改(指针常量除外),而引用定义时必须初始化,且一旦初始化以后其引用目标不能再改变。
int a,b;
int
p;//ok
p = &a;//p指向a
p = &b;//p指向b
------------------
int& r;//error
int& r = a;//r引用a,r只能是a的别名
r = b;//ok,但不是修改引用目标,仅是赋值操作

//下面内容了解
3)可以定义指针的指针(二级指针),但是不能定义引用的指针
int a;
int* p = &a;
int** pp = &p;//ok,pp称为二级指针
------------------------------
int& r = a;
int&* pr = &r;//error
int* pr = &r;//ok,但是就是一个普通指针
4)可以定义指针的引用(指针变量的别名),但是不能定义引用的引用
int a;
int* p = &a;
int*& rp = p;//ok,指针的引用
----------------------------
int& r = a;
int&& rr = r;//error,C++中叫右值引用
int& rr = r;//ok,但是就是一个普通的引用
5)可以定义指针数组,但是不能定义引用数组
int a,b,c;
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)和函数指针类似,也可以定义函数的引用(函数的别名),其语法特性和函数指针一致。
void func(int a,int b){…}
int main(void){
void (*pf)(int,int) = func;
pf(100,200);//ok
---------------------
void (&rf)(int,int) = func;
rf(100,200);//ok
}

十一 类型转换
1 隐式类型转换
char c = ‘a’;
int n = c;//隐式

void func(int n){…}
func©;//隐式

int func(void){
char c = ‘a’;
return c;//隐式
}

2 显式类型转换
2.1 C++兼容C中强制转换
char c = ‘A’;
int n = (int)c;//C风格
int n = int©;//C++风格,和上面等价
2.2 C++扩展了四种操作符形式的显式类型转换
1)静态类型转换
语法:
目标类型变量=static_cast<目标类型>(源类型变量)
适用场景:
主要用于将void*转换为其它类型的指针.
int n = static_cast©;
2)动态类型转换(后面讲)
语法:
目标类型变量=dynamic_cast<目标类型>(源类型变量)
3)常类型转换
语法:
目标类型变量=const_cast<目标类型>(源类型变量)
适用场景:
主要用于去掉指针或引用的常属性

Volatile修饰变量表示易变的,告诉编译器 每次在使用该变量时都要小心从内存中重新读取,不要直接使用寄存器中的副本,防止编译器优化导致的错误结果

4)重解释类型转换
语法:
目标类型变量=reinterpret_cast<目标类型>(源类型变量)
适用场景:
–》任意类型指针或引用之间的显式转换
–》在指针和整数之间进行转换
eg:向物理内存0x12345678保存整数100?
int* paddr =
reinterpret_cast<int*>(0x12345678);
*paddr = 100;

小结:来自C++社区建议
1 慎用宏,可以使用const、enum、inline替换
#define PAI 3.14
–》const double PAI = 3.14;
#define SLEEP 0
#define RUN 1
#define STOP 2
–》enum STATE{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替换malloc/free
4 少用void*、指针计算、联合体、强制转换.
5 尽量使用string表示字符串,少用C风格的char*

十二 类的对象//了解
1 什么是对象?
万物皆对象,任何一种事物都可以看作是对象
2 如何描述对象
通过对象的属性(名词、数量词、形容词)和行为(动词)来描述。
3 面向对象的程序设计
对自然世界中的对象观察引入到编程实践中一种方法,这种方法称为"数据抽象",即描述对象时把细节东西剥离出去,只考虑一般性的,有规律性的,统一性的东西。
4 什么是类?
类就是将多个对象的共性提取出来定义一种新的数据类型,是对 对象属性和行为的抽象描述.
现实世界 类 编程世界
具体对象–抽象–》属性/行为–实例化–》具体对象

十三 类的定义和实例化
1 类的一般语法形式
class/struct 类名:继承方式 基类,…{
访问控制限定符:
类名(形参表):初始化表{}//构造函数
~类名(void){} //析构函数
返回类型 函数名(形参表){}//成员函数
数据类型 变量名;//成员变量
};
2 访问控制限定符
1)public:公有成员,任何位置都可以访问
2)private:私有成员,只有类的内部才能访问
3)protected:保护成员(后面讲)
注:class定义的类默认的访问控制属性是private(私有),而struct定义的类默认的访问控制属性是public(公有).
class/struct 类名{
int a;//私有/公有
public:
int b;//公有成员
private:
int c;//私有成员
public:
int d;//公有成员
int e;//公有成员
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值