没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
C++
C++和 C 的区别
设计思想上:C++是面向对象,C 是面向过程。
语法上:
C++具有继承、封装、多态三种特性,C++相比 C 增加了许多类型安全的功能,比
如强制类型转换。
struct 不同,C 语言中 struct 不可以有成员函数、静态成员变量,成员属性只能为
public,不可以直接初始化成员。
new、malloc 不同。
封装、继承、多态
封装:封装自己的属性和方法,
继承:代码复用
多态:一个接口,多种方法。实现主要包括静态多态和动态多态,静态多态主要是重载,
在编译的时候就已经确定;动态多态是用虚函数机制实现的,在运行期间动态绑定,根据基
类的引用(指针)指向的对象来确定自己具体该调用哪一个类的虚函数。
Inline 函数
(1)相当于把内联函数里面的内容写在调用内联函数处;
(2)相当于不用执行进入函数的步骤,直接执行函数体;
(3)相当于宏,却比宏多了类型检查,真正具有函数特性;
(4)编译器一般不内联包含循环、递归、switch 等复杂操作的内联函数;
(5)在类声明中定义的函数,除了虚函数的其他函数都会自动隐式地当成内联函数。
(6)内联函数只是对编译器的建议,是否对函数内联,决定权在于编译器。
Extern C
extern "C" 的作用是让 C++ 编译器将 extern "C" 声明的代码当作 C 语言代码处理,可以
避免 C++ 因符号修饰导致代码不能和 C 语言库中的符号进行链接的问题。
C++源文件到可执行文件的过程
(1) 预处理:对源代码中的文件包含关系(头文件)、预处理语句(宏定义)进行分析和
替换,生成预编译文件;
(2) 编译:将经过预处理后预编译文件转换成特定的汇编代码,生成汇编文件;
(3) 汇编:将编译阶段生成的汇编文件转化成机器码,生成可重定位目标文件;
(4) 链接:将多个目标文件及所需要的库链接成最终的可执行目标文件。
静态链接、动态链接
静态链接:在编译时将软件库直接链接到可执行文件,内存空间融合,可执行文件增大。
优点:程序在发布时不需要依赖库,可以独立执行;
缺点:程序的体积会相对较大,若如果静态库更新,所有可执行文件需要重新链接;
动态链接:在运行(加载)时将软件库加载到内存映射区,可执行文件不会明显增大。
优点:多个程序可以共享同一个动态库,节省资源;
缺点:运行时加载,可能影响程序前期执行性能。
#include 头文件双引号和尖括号的区别
编译器预处理阶段查找文件的路径不一样。
双引号:当前头文件目录——>编译器设置的头文件路径——>系统变量指定的头文件路径
尖括号:编译器设置的头文件路径——>系统变量指定的头文件路径
static 关键字的作用
(1) 全局静态变量:静态存储区,整个程序运行期间一直存在,未被初始化时被自动初
始化为 0,作用域为定义处至文件结尾。
(2) 局部静态变量:静态存储区,未被初始化时被自动初始化为 0,定义变量所在的语
句块或函数运行结束时,未被销毁,但是不能访问,下次进入函数时值不变。
(3) 静态函数:只在声明的文件中可见,不能被其他文件调用(函数默认为 extren)。
注意,不要在头文件中声明静态全局函数,不要在 cpp 中声明非静态函数。
(4) 类的静态成员:类的对象之间值共享,不是某个对象的成员。在类中定义后,在类
外要重新定义。(可以是 private 成员)
(5) 类的静态函数:和静态数据成员一样都属于类的静态成员,不是对象成员,对静态
成员的引用不需要用对象名。在静态成员函数的实现中,不能直接引用类中的非静
态成员,可以引用类中说明的静态成员。如果类的静态成员函数需要引用非静态成
员,可通过对象引用。
const 关键字
作用:限定变量为不可更改,限定成员函数不可以更改任何数据成员。
static const 的整型(bool、char、int、long)可以在类中声明并且初始化。
在 C 和 C++的区别:
在 C 语言中,const 修饰的变量是只读,本质上还是一个变量,不是真正的常量,const
修饰的局部变量在栈上分配存储空间,const 修饰的全局变量在只读存储区中分配存储空间,
const 只在编译器有用,在运行期间没有用,可以使用指针的方式更改 const 变量的值。
在 C++中,const 修饰的变量放在符号表中,在编译的过程中,如果发现常量,则直接
以符号表中的值进行替换。在编译过程中,如果发生(对 const 常量使用了 extern,对 const
常量使用了取地址符&)等情况,则为常量分配存储空间,但是虽然分配了存储空间,但是
却不会使用该存储空间的值。
volatile 关键字
作用:防止优化编译器把变量从内存装入 CPU 寄存器中,让编译器每次操作该变量时一定
要从内存中真正取出,而不是使用已经存在寄存器中的值。
(一般的对象编译器会将数据的拷贝放在寄存器中用以加快指令的执行速度。)
(1) 并行设备的硬件寄存器;
(2) 中断服务子程序中会访问到的非自动变量;
(3) 多线程应用中被几个任务共享的变量。
explicit 关键字
explicit 修饰符:修饰单个参数的构造函数,explicit 表示构造函数只接受显示转换,例如构
造 A a(0);可行,构造 A a=0;不可行,因为 a=0 相当于将 0 隐式的转换成构造函数的参数。
只能适用于单个参数,或者其余参数都有默认值可以缺省的情况。
#include <iostream>
using namespace std;
class A {
public:
A(int x){
cout<<"A 我被调用了"<<endl;
}
};
class B {
public:
B(int x) {
cout << "B 我被调用了" << endl;
}
};
void f(A a) {}
void f(B b) {}
int main(void){
f(1); // f(A a),f(B b)都符合要求,产生歧义,编译无法通过
return 0;
}
空类默认函数
拷贝构造函数、赋值操作符、析构函数。
类中如果声明了一个构造函数,则不会再创建默认构造函数。
类成员初始化顺序
成员变量使用初始化列表初始化时,与构造函数中初始化成员列表的顺序无关,只与成
员变量的定义顺序有关。类中的 const 成员变量必须在构造函数初始化列表中初始化。类中
的 static 成员变量,只能在类外初始化。
构造过程:分配内存、父类构造(按照父类的声明顺序)、构造虚表指针,对虚表指针赋值、
根据初始化列表中的值初始化变量、执行构造函数{}内语句。
析构过程:
virtual 析构
多态时父类指针指向子类对象,析构函数不为 virtual,只会调用父类析构,不会调用子类析
构,造成内存泄露。
类型转换 cast
(1) const_cast:用于将 const 指针(引用)转换为非 const 指针(引用),目标只能是指
针或引用。volatile 也可以。
对于未定义 const 版本的成员函数,通常需要使用 const_cast 来去除 const 引用
对象的 const,完成函数调用(把一个 const 指针传入一个接受非 const 指针的函数
里)。
(2) static_cast:静态类型转换,可替换 C 语言中类型转换。
用于各种隐式转换,比如 const 转非 const,void*转指针等。
上行转换:派生类指针(引用)转换为基类是安全的。
下行转换:基类指针转换为派生类时没有动态类型检查,不安全。
(3) dynamic_cast:用于多态中父子类间的多态转换。只适用于含有虚函数的类,用于类
层次间向上和向下转换。只能转指针或引用。
向下转换时,如果是非法的对于指针返回 nullptr,对引用抛出异常。(向上转
换指的是子类向基类的转换;向下转换指的是基类向子类的转换)。
当使用基类指针指向派生类实现多态时,可以使用 dynamic_cast,该基类指针
转换为派生类指针。
dynamic_cast 也能够完成空指针在任意指针类型上的转换,以及任意指针类型
向 void*的转换。
(4) reinterpret_cast:数据二进制的重新解释,不改变其值。什么都能转,比如将 int 转
指针,可能会出问题,尽量少用。(简单的二进制复制)
RTTI(运行时类型识别):typeid – dynamic_cast
typeid:返回指针和引用所指的实际类型。
dynamic_cast:将基类类型的指针或引用安全地转换为其派生类类型的指针或引用。
指向派生类的基类指针 B 想访问派生类 D 中的除虚函数之外的成员时就需要
把该指针转换为指向派生类 D 的指针。
指针和引用的区别
(1) 指针有自己的空间,引用只是别名;
(2) sizeof 指针为 4(32 位机器为 4,64 位机器为 8),引用为被引用对象的大小;
(3) 指针可以不初始化为 nullptr,引用必须被初始化为一个已有对象的引用;
(4) 作为参数传递时,指针必须要解引用才可以对指向的对象操作,直接对引用的操作
都会直接更改引用所指向的对象;
(5) 有指针常量,没有引用常量;
(6) 指针可以更改指向的对象,引用一经初始化后不可更改;
(7) 指针可以有多级,引用只有一级;
(8) 指针和引用的++运算符意义不一样;
(9) 如果返回动态分配的内存,必须使用指针,引用可能引起内存泄露。
悬挂指针和野指针
悬挂指针:指向的资源被释放,指向已被回收的资源
野指针:未被初始化
智能指针(RAII 资源获取即初始化)
(1) auto_ptr
auto_ptr<string> p1(new string("Hello world!"));
auto_ptr<string> p2;
p2 = p1; // 不报错,p1 变为 empty
(2) unique_ptr
unique_ptr<string> p1(new string("Hello world!"));
unique_ptr<string> p2;
p2 = p1; // 报错
当程序试图将一个 unique_ptr 赋值给另一个时,如果源 unique_ptr 为临时右值,则编
译器允许,如果源 unique_ptr 将存在一段时间,则编译器禁止。
unique_ptr<string> pu1(new string("Hello world!"));
unique_ptr<string> pu2;
pu2 = pu1; // Not allowed
unique_ptr<string> pu3;
pu3 = unique_ptr<string>(new string("You")); // Allowed
(3) shared_ptr
多个智能指针可以指向相同的对象,该对象和资源会在最后一个引用被销毁时释放。
使用计数机制来表明资源被几个指针所共享。可以通过 new 来构造,也可以通过传
入 auto_ptr、unique_ptr、weak_ptr 来构造。调用 release()时,当前指针释放资源,计
数减 1。当计数为 0 时,资源会被释放。
(4) weak_ptr
是一种不控制对象生命周期的智能指针,指向一个 shared_ptr 管理的对象只可以从
一个 shared_ptr 或者另一个 weak_ptr 对象构造,它的构造和析构不会引起计数的变
化。设计的目的是为了配合 shared_ptr 工作,用来解决 shared_ptr 相互引用时的死锁
问题,当 shared_ptr 相互引用时,资源计数永远不会清零,则资源永远不会释放。
和 shared_ptr 之间可以相互转化,shared_ptr 可以直接赋值给 weak_ptr,weak_ptr 不
可直接用于访问资源,只能通过调用 lock()获得 shared_ptr。
template<typename T>
class SmartPtr {
public:
SmartPtr() = delete;
SmartPtr(T* ptr) { p = ptr; cnt = new int(1); }
SmartPtr(const SmartPtr& ptr) { p = ptr.p; cnt = ptr.cnt; ++(*cnt); }
T operator*() { return *p; }
T* operator->() { return p; }
SmartPtr& operator=(const SmartPtr& ptr)
{
if (-- * cnt == 0) { delete p; delete cnt; }
p = ptr.p; cnt = ptr.cnt; ++(*cnt);
return *this;
}
~SmartPtr() { if (-- * cnt == 0) { delete p; delete cnt; } }
private:
int* cnt;
T* p;
};
智能指针的内存泄露
shared_ptr 循环引用,A 类指针有指向 B 类对象的 shared_ptr,B 类对象持有指向 A 类对象
的 shared_ptr,引用计数无法清零。使用 weak_ptr 解决这个问题。
剩余60页未读,继续阅读
资源评论
imDC.
- 粉丝: 4
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- alu.v
- H21-282学习参考.pdf
- QuestionTwo.java
- QuestionOne.java
- AWS Certified Solutions Architect Study Guide -SAA-C03 .docx
- 校园小情书微信小程序源码 社区小程序前后端开源 校园表白墙交友小程序.rar
- OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR).rar
- 简历-求职简历-word-文件-简历模版免费分享-应届生-高颜值简历模版-个人简历模版-简约大气-大学生在校生-求职-实习
- 南京邮电大学数学实验:熟练掌握 Matlab 软件的基本命令和操作
- 简历-求职简历-word-文件-简历模版免费分享-应届生-高颜值简历模版-个人简历模版-简约大气-大学生在校生-求职-实习
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功