目录
一,引用
1.1概念,格式
在C++中,引用是一个对象的别名,提供了对对象的直接访问,而不是对象的拷贝。
数据类型 &引用名 = 同类型的变量名 eg: int a = 10; int &b = a; // b引用a. 或者给a取个别名叫b
1.2.数组引用
给数组取个别名
#include <iostream> using namespace std; int main() { //定义一个数组 int a[5] = {10,20,30,40,50}; cout << a[3] << endl; //数组指针 int (*p)[5] = &a; //数组引用 int (&b)[5] = a; cout << b[3] << endl; //b[3] == a[3] b[2] = 900; //== a[2] = 900 cout << a[2] << endl; return 0; }
1.3函数引用
#include <iostream>
using namespace std;
int max(int x, int y)
{
return x>y ? x:y;
}
int main()
{
//函数指针
int (*p)(int, int) = max;
cout << p(23, 78) << endl;
//函数引用
int (&fun)(int, int) = max;
cout << fun(66, 99) << endl; // == max(66, 99)
return 0;
}
1.4指针和引用的区别
指针:存储地址的变量
引用:就是个别名
1> 指针可以先定义后指向, 而引用必须定义的同时初始化。
2> 定义指针需要申请空间,而引用不需要申请空间。
3> 指针的指向可以改变,而引用一旦指定目标,就不能改变。
4> 有指针数组,而没有引用数组(原因:引用不是数据类型)
5> 有二级指针,没有二级引用(原因:引用不是数据类型)
1.5传值、传址、传引用
1> 传值,函数接收的是参数值的一个拷贝,一定不会改变目标的值
2> 传址,通常是通过指针来实现的。函数接收的是变量的地址,因此可以直接访问和修改该地址上的值.可能改变目标的值,具体看代码设计
3> 传引用, 传引用是通过在函数参数中使用引用类型来实现的。与传址类似,传引用也允许函数直接修改原始变量的值。可能改变目标的值,具体看代码设计
#include <iostream> using namespace std; void fun(int a, int b) // int a = a, int b = b; { a++; b++; } void fun2(int *a, int *b) // int *a = &a, int *b = &b; { (*a)++; (*b)++; } void fun3(int &a, int &b) // int &a = a, int &b =b { int c = a; } int main() { int a = 10, b = 20; cout << "main: a = " << a << " b = " << b << endl; fun(a, b);//传值 一定不会改变目标的值 cout << "main: a = " << a << " b = " << b << endl; fun2(&a, &b);//传址 可能会改变目标的值,具体看代码设计 cout << "main: a = " << a << " b = " << b << endl; fun3(a, b); //传引用 可能会改变目标的值,具体看代码设计 cout << "main: a = " << a << " b = " << b << endl; return 0; }
二.函数重载
2.1概念
在同一个作用域下,两个以上的函数,取相同的函数名,其参数的个数或者参数的类型不同,编译器会根据实参的参数个数或类型,自动调用匹配的函数,这就是函数重载。
注意:不以返回值作为标准
2.2带有默认参数的函数定义和使用
具体的使用:如果函数调用没有给实参,那么就使用形参的默认值。如果函数调用给了具体实参,那么就使用所传递的实参。
2.3内联函数
概念: 就是在函数前加个关键字 inline ---->该函数就是内联函数。
内联函数的要求:
1> 要求代码量比较小,程序代码一般不超过5行
2> 不能有复杂的语句,比如循环,分支
3> 递归函数不能作内联
作用:提高代码的运行效率 (原因:内联函数是在编译时展开)
内联函数和带参宏替换的区别:
1> 内联函数是函数调用,带参宏是替换。
2> 内联函数是在编译时展开,而宏替换是在预处理时展开
2.4哑元
用于代码的升级优化。
在定义函数的形参时,只定义类型,不定义形参名,在函数体中也不使用。
作用:没有作用,占位
三.结构体
C++中的结构体和C语言中的结构体的区别:
1>C语言中的结构体在C++中依然使用
2> C++中的结构体可以有函数,而C语言中的结构体不可以。
3> C++定义结构体类型时,可以给变量赋初始值,而C语言中的结构体不可以。
4> C++中结构体,使用结构体类型定义变量时,可以省略关键字struct不写。而C语言中的结构体不可以。
5> C++中的结构体中有访问权限,而C语言中的结构体没有访问权限。
6> C++中的结构体有继承,而C语言中的结构体没有继承。
7> C++中的结构体有特殊的成员函数,而C语言中的结构体没有。
注意:在C++中定义结构体的结构名时,首字母大写。
C++的结构体访问权限:默认是public 共有权限
访问权限:public共有 、protected受保护、private私有
#include <iostream> using namespace std; //定义结构体类型 struct Student // == int { string name; int age; double score = 99; //定义结构体类型时,可以给变量赋初始值 void show() //定义结构体类型时,可以定义函数 { cout << name << endl; cout << age << endl; cout << score << endl; } }; int main() { //定义结构体类型变量 //struct Student s1; // == int a Student s1; //定义结构体类型变量时,可以省略关键字struct不写 s1.name = "张三"; s1.age = 18; s1.score = 88; s1.show(); return 0; }
四.类
4.1概念
C++中的类是由C++中的结构体演变而来,一般有变量又有函数的构造类型,用类来完成。
只是默认访问权限和默认继承方式以及关键字不同。(C++中的类和C++中的结构体区别)
结构体的关键字:struct
结构体的默认访问权限:public(共有的)
结构体的默认继承方式:public(共有的)
类的关键字:class
类的默认访问权限:private(私有的)
类的默认继承方式:private(私有的)
4.2访问权限
1> public: 该权限是公共的, 表示该权限下的属性(变量)、方法(函数),可以在类内、子类、类外被访问。
2> protected:该权限是受保护的, 表示该权限下的属性(变量)、方法(函数), 可以在类内、子类被访问,类外不可以被访问。
3> private:该权限是私有的, 表示该权限下的属性(变量)、方法(函数),只能在类内被访问,子类、类外不可以被访问。
4.3封装
C++的三大属性:封装、继承、多态
类的三大属性:封装、继承、多态
封装:对数据和对数据的处理捆绑在一起的过程。
属性 + 方法 = 封装
(变量) (函数)
相关名称:
类中的内容,都可以称为成员,成员又可以分为:数据成员、成员函数
一般类中的数据成员封装成private权限,成员函数封装成public权限。
五.思维导图/练习
自己封装一个矩形类(Rect),拥有私有属性:宽度(width)、高度(height),
定义公有成员函数:
初始化函数:void init(int w, int h)
更改宽度的函数:set_w(int w)
更改高度的函数:set_h(int h)
输出该矩形的周长和面积函数:void show()
#include <iostream>
using namespace std;
class Rect{
public :
void init(int w,int h){
width=w;
height=h;
}
void set_w(int w){
width=w;
}
void set_h(int h){
height=h;
}
void show(){
cout<<"宽度:"<<width<<" 长度"<<height<<endl;
}
private:
int width;
int height;
};
int main()
{
Rect re;
re.init(0,0);
re.set_w(10);
re.set_h(20);
re.show();
return 0;
}