今天开始C++-01-C到C++的过渡

一. 语法的升级

1. 引用

& 是C++里新增的引用运算符,引用的本质是起别名,不会额外占用内存空间,当作为函数形参时,取到的是原变量的地址。可以理解为所有 &变量 的地方都可以替换成 *变量,所有对 变量 的赋值操作都将替换成 &变量。

//测试用例
void print(int &a)
{
	printf("a:%p\n", &a);
	a = 2;		//修改a的值
}

int main(int argc, const char *argv[])
{
	int a = 1;
	int &b = a;
	
	printf("a = %d\na:%p\nb:%p\n", b, &a, &b); 
	print(a);
	printf("a = %d\n", b);	//重新打印a的值
	
	return 0;
}

//输出结果
a = 1
a:0xbff6f4e8
b:0xbff6f4e8
a:0xbff6f4e8
a = 2

2. 默认参数

函数形参可以赋予默认值,默认值必须从右向左赋值,否则就会报错

//示例
void a(int a = 5); 			//正确
void a(int a, int b = 5);	//正确		
void a(int a = 5, int b); 	//报错
//测试用例
void print(int a = 2)
{
	printf("a = %d\n", a);
}

int main(int argc, const char *argv[])
{
	print(1);
	print();
	
	return 0;
}

//输出结果
a = 1
a = 2

3. 函数重载

C++与所有面向面向对象的语言一样,支持函数的重载,重载规则为:只要参数、类型甚至参数顺序不同就可以函数重载,否则就不行。

//测试用例
void print(int a, char b)
{
	printf("a = %d b = %d\n", a, b);
}

void print(char a, int b)
{
	printf("a = %d b = %d\n", a, b);
}

int main(int argc, const char *argv[])
{
	int a = 1;
	char b = 2;

	print(a, b);
	print(b, a);
	
	return 0;
}

//输出结果
a = 1 b = 2
a = 2 b = 1

4. 堆内存

C中的堆内存由 malloc() 函数进行分配,由 free() 函数进行释放, C++中的堆内存由 new 关键字进行申请, 由 delete 关键字进行释放。但它们在使用时是完全相同的。

	//malloc()	->	new
	//free()	->	delete
	//示例
	int *p = new int;
	delete p;
	char *p = new char[10];
	delete [] p;
tip:上述释放数组时如果不加 [] 符号,则系统不一定会进行正确的释放,具体感兴趣的可以去测试一下。

2. 类与对象

1. 类的声明

C++中通过 class xx 的方式进行类的定义,类中通过 public 关键字指定对外开放的公共区域,通过 private 关键字只能自身使用的私有区域,未指定访问权限的区域均有私有区域

//测试示例
class A{
public: 		//公共空间,可以让外部直接访问
	void B(void){
		a = 10;
	}
	void C(void);
private:		//私有空间,只能由类内部进行访问
  		int a;
}

void A::C(void){	//外部实现类的成员函数
	printf("a = %d\n", a);
}

int main(int argc, const char *argv[])
{
	A a;
	a.B();
	a.C();
		
	return 0;
}

//打印结果
a = 10

2. 类的从成员函数

C++ 类中基本概念

术语释义
成员变量类中定义的变量
成员函数类中定义的函数
构造函数和类同名的函数,在类被创建的时候调用
this指针本类指针,即可指向当前类的指针
析构函数~类名 这种形式的函数,在类被释放的时候调用
tip:
	构造函数和析构函数都可以被重载
	如果构造函数和析构函数没有被人为重写,系统默认是存在这两个函数的,只是什么事情都没有做

关于类变量彼此间赋值,即拷贝构造函数的说明

A x = 10; 	//隐式调用
A y = x; 	//拷贝构造函数,系统默认是将私有变量拷贝一份,也就是浅拷贝
A(const A &x) //拷贝构造函数,当成员里有指针累类型的时候,浅拷贝存在很大隐患

3. 常成员和常函数

//C++中推荐使用const来定义常亮,该常亮只能使用初始化表的方法进行初始化
const int a;
//构造函数
A(int data):a(data){
}

//常函数,即该函数不可修改成员变量
void show() const {
}

4. 静态成员

在类中被 static 修饰的函数和变量可以在类被创造前使用
static 变量初始化得在类外
static 变量共享空间,在类被创建前就被创建了,所以可以不依附与类进行操作	

5. 友员

在特殊情况下,我也希望有些类可以使用自己的私有成员
如果一个外部函数需要使用私有数据,需要声明为 friend

友元函数
frind void fun();
//fun这个方法可以使用我的私有成员

友元类
fring class B;
//B整个类所有方法都可以使用我的私有成员

友元成员函数
frind void B::show();
//B类里面的show可以使用我的私有成员
注意声明的时候的顺序,例如B里有A的友元
1.声明A类 表示A的存在
2.定义B类,声明是A友元的函数
3.定义A类,声明为B里某函数的友元
4.定义B里的函数

顺序可以理解为,叫手下办事,首先得知道去哪儿办事,
然后让哪个手下去办事,再告诉人家,我具体哪个手下去办事,要让别人认识一下,最后再告诉手下具体干什么。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值