C++小白学习笔记(二)函数、封装、与类

C++小白学习笔记(二)函数、封装、与类

因为是总结的学习笔记,所以内容可能有点杂,欢迎大佬补充指正。
函数可以有默认参数
如果我们传入数据,那么就用我们传的数据,如果没有就用默认值
语法:返回值类型 函数名(形参 = 默认值){}

void swap(a,b=10)
{
	int temp = a;
	a = b;
	b = temp;  
}
swap(10, 20); //可以传数据
swap(5);//也可以不传

注意:
1.如果某个位置已经有了默认参数,那么从这个位置后 都要有默认值

void swap(a = 5,b=10) //b不能没有默认值
{
	int temp = a;
	a = b;
	b = temp;  
}

2.如果函数在声明时已经有了默认参数,那么在实现是就不能有默认参数了(程序中出现了二义性)

void swap(a = 5,b=10)void swap(a ,b)
{
	int temp = a;
	a = b;
	b = temp;  
}

函数的占位参数(也可以和有默认值):
void swap(int a,int){}//第二个int 就是占位用的
我在学习时很纳闷这除了重载能有什么用,这其实有个妙用:
占位参数与默认参数结合起来使用,兼容C语言程序中可能出现的不规范写法

//在C语言中,下面的函数可以接受任意个数、任意类型的参数,(这在是不规范的)
//void swap(void)才表示不接受任何参数.

 //void swap(void)才表示不接受任何参数.
void swap()
{

}
结合使用占位参数和默认参数,以最小的改动,将上面的代码移植到C++void swap(int x,int = 0)
{

}

函数的重载:
在c++中 函数名可以相同,以提高复用性
条件:
1.同一作作用域下
2.函数名称相同
3.函数参数的类型不同,或者顺序不同
但是 如果一个是float ,另一个是double呢 ?
这个时候需要用到强转,因为VS的编译器会把小数常量当作double类型

void func(float a){…}
void func(double a){…}

注意:不是返回值类型 是函数参数的类型不同

函数重载碰到默认参数可能会出错(因为编译二义性)

```cpp
int swap(a = 5) //b不能没有默认值
{
	int temp = a;
	a = b;
	b = temp;  
}
int swap(a ,b=10) //b不能没有默认值
{
	int temp = a;
	a = b;
	b = temp;  
}
swap(10);//这时候上下都满足,所以就会报错

类和对象
c++认为万事万物皆为对象,对象有其属性的属性和行为,把具有相同性质的对象,我们抽象为一个类。人属于人类,车属于车类。

封装
封装时是c++面向对象的三大特征之一
优点:
1.将属性和行为作为一个整体,就可以表现生活中的事物。
2.将属性和行为加以权限控制。
他的基本语法是
class 类名称
{
访问权限:属性/行为
};

class student
{
privateint age;
	string name;
publicvoid setName(string sname)//设置姓名 因为姓名是私有的,所以要给写一个接口去写
	{
		name = sname;
	}
}

访问权限有3种:
共有权限 Public 类内可以访问 类外可以访问
保护权限 protected 类内可以访问 类外不可以访问
私有权限 private 类内可以访问 类外不可以访问
类与结构体声明的方式大致相同,区别如下:
1.结构体使用栈存储,而类是用堆存储(如果对栈和堆还是有点混乱可以看我的上一篇博客)
2.类成员默认值是私有的(private),而结构体则是共有的(Pubilc)。
3.结构成员不能被声明位Protected,而类成员可以。
4.结构体是实值类型,而类是引用类型。
5.结构不需要构造函数,类则需要构造函数(注意:结构体不是不能构造函数,尽管我们很少用,不过是可以构造函数的)。
6.类是反映现实事物的一种抽象,而结构体的作用只是一种包含了具体不同类别数据的一种包装,结构体不具备类的继承多态特性。(继承写在下一章)
成员属性一般设置为私有(可以设置只读,只写)
1.可以自己控制读写权限
2.对于写可以检测数据的有效性

class student
{
publicvoid setName(string sname)//设置姓名 因为姓名是私有的,所以要给写一个接口去写
	{
		name = sname;
	}
	string getName()
	{
		return name;
	}
	void setAge(int gage)
	{
		if(age > 100 || age < 0)
		{
			cout << "你的操作有误" <<endl;
		}
		age  = gage;
	}
	int getAge()
	{
		return age;
	}
privateint age;
	string name;
}

这里补充小知识 若使用分文件编写(头文件写声明,源文件写实现)
ps:博主这里可能写的不是很详细,因为博主一直在学单片机,所以对分文件编写感觉太熟了,可能无法跟小白有同样的共鸣,如有问题请留言
首先要添加一个源文件,一个头文件
在头文件里添加
#prama once//防止头文件重复包含
#include
using namespace std;
然后在头文件中只要声明就好了
比如
int swap(int a,int b);
在分文件中首先包含头文件
include “xxx.h”
然后在下面写上函数的实现

void swap(int a,int b) //b不能没有默认值
{
	int temp = a;
	a = b;
	b = temp;  
}

如果在其他文件中用到了这个函数只需要将这个头文件包含进去就可以了

注意 :另外 还要补充一个知识 那就是作用域 ::
::这两个冒号一样的东西表示作用域和所属关系

class student
{
privateint age;
	string name;
publicvoid setName(string sname);
}
//所以存在一个函数是所属于a的
void student::test()
{
	name = sname;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值