c++ opp

一、面向对象基础

C++不是纯面向对象语言,而是基于面向对象的。因为c++包含了c,c是面向过程的。

面向对象的三大特性:封装、继承、多态

类(class/struct)包含了数据(成员变量)和函数(成员函数)

知识点一:三种访问修饰符public、protected、private

1、public成员可以在类外部之间访问,其他两个不行。

2、类中没有定义限定符,就默认为private。

3、类的访问限定符体现了面向对象的封装性。

如果在类中只做了成员函数的声明,在类外面定义时,需要表明是那个类:

class A{

public:

 void fun1();

private:

int age;

};

void A::fun1(){

cout>>age;

}

知识点二:类的实例化

1、类只是一个定义了成员变量和函数的一个集合,并没有给他们分配实际的空间来存储它们。

2、类的实例化就是创建对象的过程,他给类中的数据分配了空间,这个对象占用实际的物理空间存储类的成员变量。

3、每个对象的大小为类中所有成员变量的大小之和,遵循内存对齐原则。

注意

1、为什么要内存对齐——首先内存对齐的缺点就是浪费空间,但是他的访问速度快。因为计算机都是按4字节的整数倍开始读取,若内存对齐只需读一次,未对齐需要读两次,所以内存对齐大大提高效率。

2、空类也会占一个字节,虽然里面什么也没有,但是为了能实例化出对象,会占1个字节,表示这个空类在计算机系统里存在。

二、类

1、this指针

(1)每个成员函数都有一个指针形参,它就是this指针,它是隐式的。构造函数比较特殊,没有这个this形参。

编译器会对成员函数进行处理,在对象调用成员函数时,对象地址作实参传递给成员函数的第一个形参this指针。

(2)this指针是编译器自己处理的隐含指针形参,我们不能在成员函数的形参中添加this指针的参数定义,也不能在调用时显示传递对象的地址给this指针。

2、类的6个默认成员函数:构造函数、拷贝构造函数、析构函数、赋值操作符重载、取地址操作符运算重载、const修饰的取地址操作符重载

1构造函数:对象的定义和初始化

成员变量为私有时,要对它进行初始化,必须用一个公有的成员函数来进行访问。同时这个函数应该有且仅在定义对象时自动执行一次,这时调用的构造函数称为构造函数。

构造函数是特殊的成员函数,它具有以下特征

1、构造函数的函数名和类名相同;

2、没有返回值;

3、实例化对象时自动调用;

4、可重载;

5、可在类中和类外进行定义;

6、如果没有构造函数,编译器会自动生成一个缺省的构造函数,但是只要定义了,系统就不会生成;

7、无参和全缺省值构造函数都认为是缺省的构造函数、并且缺省的构造函数只等有一个。

2拷贝构造函数:创建对象时使用同类对象来进行初始化,这时所用的构造函数称为拷贝构造函数,这也是特殊的构造函数。

特征:

1、拷贝构造函数其实是一个构造函数的重载。

2、拷贝构造函数的参数必须使用引用传参,使用传值会造成无限递归。

3、若未显示的定义,系统会默认缺省的拷贝构造函数。缺省的拷贝构造函数会依次拷贝类成员进行初始化>

  3、析构函数:当一个对象的生命周期结束时,c++编译系统会自动调用一个特殊的成员函数——析构函数。

特征:

1、析构函数是在类名前加~。

2、析构函数无参数,无返回值。

3、一个类只有一个析构函数,若未显示定义,系统会自动生成缺省的析构函数。

4、对象生命周期结束时,编译器自动调用析构函数。

5、析构函数并不是删除对象,而是做一些清理工作。

4、运算符重载:C++为了增强程序的可读性,支持运算符重载

注意:不能重载的运算符:.*       ?:      ::         sizeof          .

特征:

1、operator+运算符 构成函数名 

2、运算符重载以后不能改变运算符 优先级、结合性、操作个数。

(1)赋值运算符重载

拷贝构造函数是创建对象,使用一个已有对象来初始化这个准备创建的对象。

赋值运算符的重载是对一个已经存在的对象进行拷贝赋值。

三、const成员函数/内联/友元/静态成员:

const成员函数:在成员函数后面加const,const修饰this指针所指的对象,也就是调用这个const成员函数的对象在函数内不会改变。

内联:inline修饰的函数叫做内联函数,编译时c++编译器会将调用内联函数的地方展开,没有函数数据压栈的开销,提高了运算效率。

注意:

1、inline是一种空间换时间的做法,省去调用函数的开销,所以代码很长、有循环/递归的函数不适合内联,若有,编译器会自动优化,省略内联。

2、inline必须和函数定义放在一起,仅放在函数定义是不起作用的。

3、定义来类内的成员函数默认为内联函数。

问题:c++建议用const/枚举/内联来代替宏。宏增强代码的复用性,提高性能;但是,宏不方便调试,可读性差,容易发生错误,没有类型安全检查。

友元:c++中友元函数允许在类外访问该类中任何成员,就像成员函数一样,友元函数用关键字friend指明。

注意:友元函数不是类的成员函数;友元函数可以通过对象访问所有成员。

友元一定程度上破坏了c++的封装,友元不宜多用,在最恰当的地方使用友元。

类的静态成员:类里面static修饰的成员,称为静态类成员。类的静态成员是该类型的所有对象所共享的。静态成员函数只能访问静态的成员变量,因为静态的成员函数没有this指针,可以使用 类名::作用域访问符 直接调用静态成员函数。

猜你喜欢

转载自blog.csdn.net/FF_YTA911/article/details/84502543