C/C++
文章平均质量分 87
程序员杨小哥
微信搜索:程序员杨小哥
展开
-
【C++ primer 5e】 第一章开始
知识点整理endl 操纵符之一,结束当前行,并将设备关联的缓冲区中的内容刷到设备中。缓冲刷新操作保证到目前为止的程序所产生的所有输出都真正写入到输出流中,而不是仅停留在内存等待写入流。程序员常常在调试时添加打印语句。这类语句应该保证一直刷新流。 否则,如果程序崩溃,输出可能还留在缓冲区中,从而导致关于程序崩溃位置的错误推断。输出运算符<<接受两个对象,左侧的对象必须是一个ostream对象,右侧的对象是要打印的值,并返回左侧对象。输入运算符>>接受两个对象,左侧原创 2021-03-14 19:28:19 · 239 阅读 · 0 评论 -
C++中 value category & move
原来我也只知道C++中有左值和右值,通过今天的学习才知道,C++中不光有左值和右值。C++中有5种值类别,lvalue, rvalue, glvalue, xvalue, prvaluelvalue: 左值rvalue: 右值glvalue: generalized lvalue, 广义左值xvalue: expiring lvalue, 将亡值prvalue: prue rvalue, 纯右值看到这些不要害怕,我们一点点来。首先我们看下最熟悉的lvalue.lvalue左值是有标原创 2021-03-06 14:02:21 · 527 阅读 · 0 评论 -
C++手把手带你实现一个智能指针
为什么需要智能指针?这个问题承接上一篇文章《C++ 堆,栈,RAII》,在RAII的指引下,我们需要实现一个类来管理资源,将资源和类对象的生命周期进行绑定,这样我们就可以不用手动释放资源了。那为什么把类实现成 like pointer?上篇文章中说道,因为C++存在对象切片,而使用指针就避免了这个问题。我们现在来实现一个智能指针:首先,我们应该满足资源管理的需求: 构造函数获得资源,析构函数释放资源。class Type{ };class smart_ptr{public: s原创 2021-03-05 15:24:30 · 1360 阅读 · 0 评论 -
C++堆,栈,RAII
堆英文名称 heap,在内存管理的语境下,指的是动态分配的内存空间,这个和数据结构的堆是两回事。这里的内存,被分配之后需要手动释放,否则会引发内存泄漏。那怎么申请一个堆内存空间呢?C语言中使用void* malloc(size_t size)来申请一块内存空间,size为申请的字节数。 使用void free(void* ptr) 来手动释放内存。C++则使用 new 和 delete 来申请释放内存。C++标准里有一个相关概念是自由存储区,英文是free store,特指使用 new 和 del原创 2021-03-04 17:02:11 · 205 阅读 · 2 评论 -
C/C++ 位域 Bit fields 学习心得
Bit field 的定义“位域“ 或 “位段“(Bit field)为一种数据结构,可以把数据以位的形式紧凑的储存,并允许程序员对此结构的位进行操作。这种数据结构的一个好处是它可以使数据单元节省储存空间,当程序需要成千上万个数据单元时,这种方法就显得尤为重要。第二个好处是位段可以很方便的访问一个整数值的部分内容从而可以简化程序源代码。而这种数据结构的缺点在于,位段实现依赖于具体的机器和系统,在不同的平台可能有不同的结果,这导致了位段在本质上是不可移植的.位域的声明:位域使用以下的结构声明 , 该转载 2021-03-03 11:39:41 · 565 阅读 · 0 评论 -
C++ static, const, volatile 总结
constconst 位于 *的左侧: 用来修饰指针所指向的变量,指针指向常量。// 指针不允许改变数据int b = 500;const int *a = &b;*a = 600; // error // 可以通过变量本身去修改int b = 500;const int *a = &b;b = 600;cout << *a << endl; // 600const 位于 *的右侧: 用来修饰指针本身,指针是常量。// 指针本身是常原创 2021-03-02 19:26:53 · 370 阅读 · 0 评论 -
C++ RTTI 和四种类型转换
RTTI 是 Run Time Type Information 的缩写,从字面上来理解就是执行时期的类型信息,其重要作用就是动态判别执行时期的类型。并不是说这篇文章是RTTI,和用于RTTI的四种类型转换,而是介绍RTTI,再介绍一下4种类型转换,因为RTTI有用到其中一种类型转换,所以相当于两篇文章写在一起。实际上 RTTI 用到的是typeid() 和 dynamic_cast()。为什么会有RTTI?C++是一种静态类型语言,其数据类型是在编译期就确定的,不能在运行时更改。然而由于面向对象程原创 2021-03-02 15:47:22 · 422 阅读 · 0 评论 -
c++虚继承,多继承
看这一篇文章之前强烈建议先看以下我之前发布的虚指针,虚函数剖析例1: 以下代码输出什么?#include <iostream>using namespace std;class A {protected: int m_data;public: A(int data = 0) {m_data=data;} int GetData() { return doGetData(); } virtual int doGetData() { return原创 2021-02-28 19:00:07 · 497 阅读 · 0 评论 -
5分钟掌握C++中的三种继承方式
public 方式继承基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员可见,基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态;基类的私有成员不可见,基类的私有成员仍然是私有的,派生类不可访问基类中的私有成员。基类成员对派生类对象的可见性对派生类对象来说,基类的公有成员是可见的,其他成员是不可见的。所以,在公有继承时,派生类的对象可以访问基类中的公有成员,派生类的成员函数可以访问基类中的公有成员和保护成员。简单来说,派生类能访问基类的public, protected成员原创 2021-02-28 08:36:39 · 822 阅读 · 0 评论 -
为什么使用初始化列表会快一些?
查看下面两段代码:// (1)class classA {...};class classB{public: classB(classA a) {mA = a;}private: classA mA;};// (2)class classA {...};class classB{public: classB(classA a): mA(a) {}private: classA mA;};为什么2的效率要高?初始化列表的效率要高。首先把数据原创 2021-02-27 01:57:52 · 1699 阅读 · 1 评论 -
虚函数,虚表深度剖析
面向对象,从单一的类开始说起。classA{private:intm_a;intm_b;};这个类中有两个成员变量,都是int类型,所以这个类在内存中占用多大的内存空间呢?sizeof(A), 8个字节,一个int占用四个字节。下图验证:这两个数据在内存中是怎样排列的呢?原来是这样,我们根据debug出来的地址画出a对象在内存的结构图如果class A中包含成员函数呢? A 的大小又是多少?classA{...原创 2021-02-27 01:55:29 · 699 阅读 · 0 评论 -
C++怎么判断大小端模式
大小端模式:大端模式: 先存放最高有效字节,表现为最高有效字节存储在低地址小端模式: 先存放最低有效字节,表现为最低有效字节存储在低地址小端模式便于机器处理, 大端模式方便人阅读。测试平台的字节序模式:// 代码1union test { int a; char b;} c;int main(int argc, char const *argv[]){ c.a = 1; cout << (c.b & 1 ? "小端" : "大端".原创 2021-02-26 12:51:58 · 1160 阅读 · 1 评论 -
关于面向对象的面试知识点整理(一)
例1: C++ 中的空类默认产生哪些类成员函数?对于一个空类,编译器默认产生4个成员函数:默认构造函数、 析构函数、 拷贝构造函数和赋值函数。例2: structure是否可以拥有constructor / destructor及成员函数?如果可以, 那么structure和class还有区别么?区别是class中变量默认是private, struct中的变量默认是public。struct可以有构造函数,析构函数,之间也可以继承,等等。 C++中的struct其实和class意义一样, 唯一不同的原创 2021-02-25 20:57:46 · 225 阅读 · 0 评论