首页 > 代码库 > 狄泰软件学院C++课程学习笔记汇总

狄泰软件学院C++课程学习笔记汇总

                                                                              深度剖析C++

1、类是一种模型,这种模型可以创建出一个对应的实体。有了类不一定有对应的实体,但是一个实体必定属于某一个类。

2、类用于抽象的描述 一类事物所持有的属性和行为;对象是具体的事物,拥有所属类中描述的一切 属性和行为。

3、类一定都源于生活,两个对象实例不可能完全相同。

4、类之间的基本关系:继承和组合。

继承:从已有的父类细分出来的类和原有的类之间具有继承关系(is-a);继承的子类拥有父类的所有属性和方法

组合:一些类的存在必须依赖于其他类,组合的类在某一个局部上由其他的类 组成 ;组合关系是整体和局部的关系(生死共存亡,比如电脑类由CPU类、内存类的、显卡类等组成)

5、一个类通常分为以下两个部分:类的实现细节(类的实现)和类的使用方式(类的声明);c++中的类支持声明和实现的分离;将类的实现和定义分开。.h头文件只有成员变量和成员函数的声明,.cpp文件中完成类的实现。

必须在类的表示方法中定义属性和行为的公开级别,类似文件系统中文件的权限。需要注意的一点是访问权限public和private都是针对类外部的访问而言的,在类内部无论是public还是private都是可以访问成员变量和成员函数的,即类成员的作用域与访问级别没有关系。

6、c++中struct和class的主要区别就是成员变量和成员函数的默认访问级别不同,struct的默认访问级别是public的,而class是private的。

7、从程序设计的角度来看,对象也只是个变量,他的类型是类 类型,因此在栈上创建对象时,成员变量初始值为随机值(eg:Test t);在堆上创建 对象时,成员变量初始值为随机值(eg:Test t =Test()  或者是Test *t =new Test,注意这两种的区别,前者是一个临时对象的拷贝(构造函数本质上就是一个临时对象),后者是类对象指针的定义);在静态存储区创建对象时成员变量初始值为0(eg:全局变量)。

8、构造函数在对象创建后给对象的状态进行初始化,而初始化列表先于构造函数执行,是在对象创建时对对象进行初始化

9、构造函数没有返回值,但可以有参数,即可以重载;而析构函数没有返回值也没有参数。

经典代码示例:

 

#include <stdio.h>
#include <iostream>
/*
#include "DataStruct.h"
#include <array>
*/
class Test
{
private:
int i;
int j;
public:
Test()
{
i=0;
j=0;
}
Test(int v1,int v2)
{
i=v1;
j=v2;
}
~Test()
{
printf("我是析构函数\n");
}
void sleep();
void setValue(int m,int n);
int getValue_i();
int getValue_j();
void eat();
};
void Test::sleep()
{
printf("我是睡觉动作\n");
}

 

void Test::eat()
{
printf("我是吃饭动作\n");
}
void Test::setValue(int m,int n)
{
i=m;
j=n;
}
int Test::getValue_i()
{
return i;
}
int Test::getValue_j()
{
return j;
}

 

 

 

int main()
{
// ①Test t=Test(1,2);
// ②Test t;
// ③Test t(1,2);
Test *t=new Test;//④
t->setValue(1,2);
printf("i=%d\n",t->getValue_i());
printf("j=%d\n",t->getValue_j());
t->~Test();//调用析构函数
system("pause");
return 0;
}

 

10、对于构造函数,一个类中可以存在多个重载的构造函数(参数及其类型可以不同),构造函数的重载遵循C++重载的规则。注意:对象的定义和对象的声明不一样,对象的定义是指申请一个对应对象的空间并且调用构造函数;而对象声明是告诉编译器存在这样一个对象 。对象定义时即会触发 构造函数的调用,在一些情况下可以手动调用构造函数。

11、两个特殊的构造函数:(1)无参构造函数(2)拷贝构造函数(该种构造函数在创建对象时拷贝对象的状态

(1)无参构造函数就是没有参数的构造函数,函数体为空 Test(){}

(2)拷贝构造函数就是参数为(const class_name &obj)的构造函数;当类中没有定义拷贝构造函数时,编译器会默认提供一个拷贝构造函数,简单的进行成员变量的值复制浅拷贝) 。   【 编译器提供的就是浅拷贝。】

拷贝函数的意义:兼容C语言的初始化方式 ,另外初始化行为能够符合预期的逻辑。

拷贝构造函数包含浅拷贝(拷贝后对象的物理状态相同)和深拷贝(拷贝后对象的逻辑状态相同)两种;有时候在资源分配上浅拷贝会带来一些问题,比如在类中我随便定义一个指针,这个指针指向的内存地址为0x1234;当使用浅拷贝时候(我们把一个对象复制给另一个对象),拷贝后的那个对象中的指针也同样会指向内存地址0x1234;那么我们在释放指针空间的时候只能释放一次,技术分享

这就是浅拷贝物理意义上的拷贝;而 如果是深拷贝的话我们在把一个对象的指针复制给另一个对象的时候,会在内存空间重新找一块区域,把数值放进去,在释放指针的时候也可以两次释放,这就是逻辑状态下的深拷贝。

(3)什么时候需要深拷贝?一般情况下对象中有成员指代了系统中的资源(包括动态内存空间、指针定义、文件打开、网络端口的使用等等)时候需要深拷贝,当我们在类中自定义了拷贝构造函数时,必然要实现深拷贝(否则就使用编译器提供的浅拷贝了)。

代码示例:

 

 

 

 

经典代码示例:开发一个 数组类解决 原生数组 的安全性问题。

 

狄泰软件学院C++课程学习笔记汇总