C++笔记(面试准备)

1.c++四区

  1. 代码区

  2. 全局区
    全局区:1.全局变量。2.静态变量static。3.常量:const 全局和字符串常量
    不在全局区:1。局部变量。2.const局部变量

  3. 栈区:
    注意事项:1.不要返回局部变量的地址。2.栈区的数据由编译器开辟和释放(函数结束自动释放)

  4. 堆区
    利用关键字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.重载

  1. 同一个作用域下
  2. 函数名相同
  3. 函数参数类型不同,或者个数不同,或者顺序不同

6.对象的初始化和清理

构造函数和析构函数
构造函数:默认初始化
析构函数:对象销毁前,默认清理工作
写不写这两个函数,编译器都会自动执行(如果没有定义,他们的函数体是空的)

7.构造函数

两种方式:有参数构造和无参构造
三种调用方式:括号法,显示法,隐型转换

//注意事项:
//默认构造函数不要加()
Person pa();//编译器会认为是函数的声明

拷贝构造函数

  1. 初始化一个新对象
  2. 值传递方式给函数参数赋值
  3. 以值传递方式返回局部对象

构造函数调用规则:
默认下:
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)

  1. 函数模板
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,地址晚绑定)

动态多态使用

  • 父类的指针或引用指向子类对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值