目录
1.c++四区
-
代码区
-
全局区
全局区:1.全局变量。2.静态变量static。3.常量:const 全局和字符串常量
不在全局区:1。局部变量。2.const局部变量 -
栈区:
注意事项:1.不要返回局部变量的地址。2.栈区的数据由编译器开辟和释放(函数结束自动释放) -
堆区
利用关键字new,开辟到堆区,由程序员控制(程序结束才释放)delet。
2.引用
1.给变量取别名
数据类型 &别名=原名
2.引用必须初始化,初始化后就不可以更改。
3.引用传递,型参会修饰实参,作用:引用作函数参数可以简化指针修改实参。
4.函数的调用可以作为左值。
5.引用实质:使用中,编译器帮我们解引用了
int &ref=a;
int * const ref =&a;
6.常量引用:主要用来修饰形参,防止形参改变
3.函数
1.函数默认参数
- 如果输入数据就用自己的参数,没有就用默认参数
- 如果某个位置已有默认参数,那么他后面都要有默认参数
- 声明和函数只能有一个有默认参数。
int fun(int a,int b=10,int c=10);
4.class和struct的区别
他们都可以用来定义一个类
class 默认成员属性是private;
struct默认属性是public;
5.重载
- 同一个作用域下
- 函数名相同
- 函数参数类型不同,或者个数不同,或者顺序不同
6.对象的初始化和清理
构造函数和析构函数
构造函数:默认初始化
析构函数:对象销毁前,默认清理工作
写不写这两个函数,编译器都会自动执行(如果没有定义,他们的函数体是空的)
7.构造函数
两种方式:有参数构造和无参构造
三种调用方式:括号法,显示法,隐型转换
//注意事项:
//默认构造函数不要加()
Person pa();//编译器会认为是函数的声明
拷贝构造函数
- 初始化一个新对象
- 值传递方式给函数参数赋值
- 以值传递方式返回局部对象
构造函数调用规则:
默认下:
1.默认构造函数空
2. 默认析构函数为空
3. 默认拷贝函数,对属性进行值拷贝
规则如下:
1.如果定义有参构造函数,则编译器不提供无参构造。
2.如果定义拷贝构造,编译器则不提供其他构造函数。
8.深拷贝和浅拷贝
浅拷贝:简单的赋值拷贝操作
深拷贝:在堆区重新申请空间,进行拷贝操作。(new)
析构函数释放空间的时候浅拷贝容易出错
9.初始化列表
Person (int i_,int j_):I(i_),J(i_)
{
}
10.静态成员函数
类内声明,类外初始化。
1.所有对象共享同一个函数
2.静态成员函数只能访问静态成员变量(无法区分到底哪个对向的变量)。
两种访问方式:1.通过类。2.通过类名。
11.c++对象模型和this指针
1.成员变量和成员函数分开存储
2.只有非静态成员变量存储在类的对象上;静态成员变量不属于类对象上等等;
this指针:this指针指向被调用成员函数的所属对象。(this指针本质 指针常量 指向不能修改)
用途:
1.当形参和成员变量同名时,可以用this指针来区分
2.在类的非静态成员函数中返回对象本身可以使用 return *this
12.const修饰成员函数
常函数:
//this指针本质 指针常量 指向不能修改
//Person * const this
//const Person * const this
void show() const
{}
常对象:
常对象只能调用常函数
加上 mutable可以修改
13.友元
friend:
友元的三种实现:
- 全局函数作友元
class Building{
friend void goodGay(Building *building);
};
void goodGay(Building *building);
- 类作友元
- 成员函数作友元
14.运算符重载
对已经有的运算符进行定义,赋予其另一种功能,以适应不同的数据类型
Person operator+(Person &p){}
Person operator+(Person &p1,Person &p2){}
class Person{
public:
Person(){};
Person(int a,int b){
this->m_a=a;
this->m_b=b;
}
Person operator+(Person &p){
}
int m_a;
int m_b;
};
15.extern
全局变量的声明
如果在头文件定义全局变量,则需要先在.h文件里面 + extern,然后在 .cpp文件中定义。
如果不用 extern在头文件声明,那么当引用多个该头文件时会出现重定义问题。
16.继承
规则
- 公有继承:父类属性不变,父类私有不能访问
- 保护继承:变为保护属性,父类私有不能访问
- 私有继承:变为私有属性,父类私有不能访问
继承中的构造和析构顺序
先构造父类,再构造子类,析构的顺序与构造相反
同名成员函数处理
- 子类对象可以直接访问子类中的同名成员
- 子类对象加作用域可以访问到父类同名成员
- 成员函数和上面规则一样
访问静态成员
- 通过对象访问
- 通过作用域访问
虚继承
关键字:virtual
作用:用于菱形继承,防止子类出现多个父类成员(二异性)
class Sheep : virtual public Animal {};
17 模板(template)
- 函数模板
template <class(或者typename) 形参名,class(或者typename) 形参名,...>
返回类型 函数名(形参列表)
{
函数体
}
例子
template <class T> void swap(T& a, T& b)
{
....
}
使用
- swap<int>(a,b);
- template void swap<int>(int %a, int& b);
18 多态
1. 基本概念
满足条件:
- 有继承关系
- 子类重写父类的虚函数(virtual,地址晚绑定)
动态多态使用
- 父类的指针或引用指向子类对象