1.引用(接上篇引用内容)
1)常量的引用
const int& x=y; x++;(错误)不可以修改const常量的值
一般用在函数中,用来防止修改的值 void(const int& x){ }
2)引用和指针的区别(面试题)
①指针可以修改指向,引用不可以修改指向
②指针保存的是地址,引用只是一个别名
③指针不一定要初始化,只是野指针,但引用必须初始化
④指针本身有内存空间,而引用没有
⑤有指针的引用,没有引用的指针
⑥指针的堆空间是需要释放的,而引用不需要释放
2.面向对象
1)基本概念:c++在c的基础上增加了面向对象的概念,支持面向对象的设计,类是c++的核心,类是泛指,具有属性和行为,具有成员变量和成员函数。对象是特指,类中的某一个个体,具有类的属性和行为。
2)面向对象的特征
封装 继承 多态
3)定义一个类
关键字是class,格式 class 类名 { 成员变量 ; 成员函数};
4)访问修饰符
public: 共有属性,在类内可以使用,类外可以使用,子类可以使用;
private: 私有属性,只可以在类内使用,其他地方没法访问。
protected: 保护属性,在类内可以使用,可以在子类中使用,不可以在main中使用
不写修饰:默认是私有属性
5)get和set方法
当定义私有成员或者保护成员变量时,为了给外界提供修改变量的方法,时常会定义两个共有的成员函数,一个是get是获取私有成员变量的值,一个set是设置私有变量的值。
使用: 正常函数的使用,和对象.成员函数(参数) 一样的使用方式
6)this指针
定义: this指针表示“我”,是代词。定义的对象是什么则this表示什么
使用:在普通成员函数中,编译器会自动添加当前类对象的this指针;
总结:每个对象都有this,指向对象本身,每个对象可以通过this访问到成员变量;
静态成员函数中没有this指针,友元函数中没有this指针;
7)类和结构体区别(c++中)
A: 类和结构体的关子健不一样
B: 类中的成员方法和属性默认是私有的,而结构体中默认是共有属性
C: 在c++中类和结构体都可以定义对象,使用方法一样
D: 类和结构体中都可以有限定符修饰 public protected private修饰
E: 结构体可以添加struct关键字,而class不需要;
F: 结构体主要是c语言中,而class主要用于c++中。
注意事项:在c++ 中 结构体可以省略struct关键字
3)构造析构
①构造函数:是函数,在构造对象的时候调用,用来创建一个对象。
②定义: 没有返回值(void都没有)且函数名和类名相同的函数
③作用: 一般是用于构建对象的时候给初始值使用。
④重载:构造函数可以重载,也是参数列表不同;
缺省参数: 构造函数也可以设置缺省参数;但需要避免重载的二义性;
注意:如果没有手动写构造,编译器会自动创建构造函数,叫做缺省构造(无参)。
主要手动添加了构造,则编译器会注释掉自动添加的构造函数。
构造函数只可以是public属性(单例模式是特殊情况),公有属性;
构造函数也是成员函数,需要添加public属性
只要手动写构造,则一般会手动添加无参构造函数
⑤构建对象: 在构建对象的时候,如果构造函数没有参数,则直接类名 对象名的方式
如果只有有参构造,在构建对象时候需要加上实参,例如: student danny(1,2);
⑥构造函数的初始化列表
定义:在构造函数的初始化列表部分可以给成员变量赋值;
格式: 类名(参数):成员变量1(参数1),成员变量2(参数2){ }
注意:构造函数的初始化列表先执行,再执行函数体中代码;
初始化列表后只可以成员变量的初始化,不可以是参数等其他变量的初始化
初始化列表中的初始化顺序和成员变量的定义顺序有关
和初始化列表的顺序无关
4.析构函数
定义:析构也是特殊的成员函数,用来释放对象。不可以主动调用。
格式: ~类名() { 函数体}
注意: 析构函数的函数名是~+类名, ~student(){ }
析构函数没有返回值,不可以写void
析构没有参数,不可以写参数,因为不可以主动调用。
如果没有手动添加析构,c++会自动添加析构函数。释放对象时候会自动调用;
作用: 用来释放内存,关闭文件,用来释放句柄,用来关闭线程。。。。。善后工作
5.拷贝构造
定义:也是构造函数的一种,是根据其他对象来构建一个新对象。
格式:类名(const 类名& 对象名) { 函数体}
浅拷贝和深拷贝:
浅拷贝: 只会拷贝指针,不会拷贝指针对应的内存空间(避免)
student(const student& other)
{
p = other.p;
}
深拷贝:会先申请内存空间,拷贝指针指向的内存空间值,对象指向不同内存;
student(const student& other) {
//防止自拷贝
if(&other == this)
{
return;
}
//先释放内存再申请
if( p != NULL)
{
delete p;
}
//申请内存拷贝值
this->p = new int(*other.p);
}
深拷贝注意事项: 需要防止自拷贝,如果指针指向了某一个内存,需要先释放在申请
注意:如果一个类中什么内容都没有,sizeof(类名)的大小是1字节
如果没有写拷贝构造,编译器默认会添加一个浅拷贝构造 ;
6.声明和定义分离
①在头文件中定义类,在cpp中实现类中的成员函数
②方式: 返回值类型 类名::函数名(参数){ }
需要加上类名限定符,表示当前函数是属于哪个类的;
目的:为了模块化编程,一个h和一个cpp关联,h用来申明,cpp用来实现
为了隐藏函数的实现,只提供.h给外界。
防止头文件包含除了用#ifndef 还可以用#pragma once