C++基础学习
文章平均质量分 66
本专栏大部分是从c++primer等书中的知识进行的整理, 对部分的知识点添加了些自我的认识
Function_18
这个作者很懒,什么都没留下…
展开
-
c++对象的内存布局
类的内存分布引言大概有接近一年的时间没有怎么用过c++了, 大多数时间都在学习关于linux以及linux C的知识, 一直想总结一些c++的知识却总不知怎么写, 从哪里入手, 前几月重新整理了一些关于c++类的内存分布的验证实验就想着正好可以用于切入口。 毕竟我在学习c++的过程中, 是先清楚了类的内存分布才后明白RTTI, 多态的基本原理, 理清这些关于多态这些就不难理解了。环境这些实...原创 2019-01-22 12:12:04 · 839 阅读 · 0 评论 -
c++ 传递常量引用比传值更好
在c++中引入了引用, 而引用其实也就是指针, 只是使用起来更加的方便. 使用使用使得在函数传值时可以为对象创造一个别名, 操作时实际上就是操作原对象本身, 这样的传引用可以避免对象传递时产生临时对象. 这样避免就可以减少很多不必要的时间和空间的开销.实际例子以Effective C++条款20的例子来分析class Person { string name, address;pu...原创 2019-01-23 12:56:11 · 1735 阅读 · 2 评论 -
c++ explicit关键字
在写类的构造函数时, 可能经常就会用到explicit关键字, 而它的具体作用就是 :只能用来修饰构造函数要求修饰的构造函数必须显示调用禁止隐式转换具体先来看一个例子:class ExplicitClass{ public: ExplicitClass(int size) : size(size) {} ExplicitClass(const char *str) : s...原创 2019-01-22 12:22:39 · 935 阅读 · 0 评论 -
c++ 强制类型转换浅析
前言在c语言中学的强制转换是用()来实现的; 而在c++中更多的是用case-name系列的关键字来告诉编译器我们需要转换的类型. c++引入这些关键字也是为了看代码的时候清晰明了, 每个关键字都有指定的功能. 下面我们就来分析这些关键字.1. static_cast在编译期间完成类型转换.a. 将原有的自动类型转换 , 如 : short转为int, int转为double, 非cons...原创 2019-01-22 13:39:10 · 390 阅读 · 0 评论 -
c++ typeid操作符
前言在分析typeid之前, 先了解什么是RTTI(运行时类型识别). RTTI使程序能够获取由基指针(引用)所指向的对象的实际派生类型, 允许用指向基类的指针(引用)来操作对象并能够获取到这些指针(引用)所指对象的实际派生类型. c++具体支持typeid和dynamic_cast两个操作符.而typeid操作符用于返回对象的引用, 实际调用的是type_info标准库类型, 也在type...原创 2019-01-22 12:20:36 · 903 阅读 · 0 评论 -
vs中c++类的内存分布调试环境
在vs中添加必要的命令就可以查看类的内存布局情况。右键项目或者项目某个文件, 选择属性在c++选项中选择命令行在其他选项中添加需要的命令, **如果你要看所有的类的内存布局, 添加/d1 reportAllClassLayout**即可如果你要看指定类的内存布局, 添加/d1 reportSingleClassLayoutXX, XX为类名。程序运行时, 在输出...原创 2019-01-22 11:59:34 · 613 阅读 · 0 评论 -
c++ 类的大小计算
前言一个空类的大小是多少? 0个字节还是一个字节?本节分析一个类的大小是多少, 怎么计算。 本节没有涉及类中有静态成员的情况, 后面会单独对静态成员做一个分析, 现在只要知道静态成员变量不在类的内存布局中。环境实验环境只要能编译运行的都可以, 只有86的环境指针的大小为4字节, 64环境指针大小是8字节。一个空类的大小一个空类也是有大小的, 其大小为1个字节。我们可以很简单的完成这个实验...原创 2019-01-22 12:08:36 · 632 阅读 · 2 评论 -
c++ 静态成员
前言类的静态成员有成员对象以及成员函数, 之所以将静态成员单独提出来, 就是因为它的特别, 静态成员对象并不在类的内存分布中, 而是在ELF中的.data段中, 是该类的每个实例化共享的资源; 同样静态成员函数也类似与普通函数, 函数体内只能直接操作静态成员对象.静态成员对象static成员对象是存储在data段中, 并不是直接存放在类中, 所以不能通过this访问到静态成员对象, 并且需要...原创 2019-01-22 12:05:59 · 326 阅读 · 0 评论 -
c++ 虚函数和多态
前言多态简单的说就是一个接口多种状态(方法), 这很像端口复用. 这里先来从虚函数入手, 再来分析多态.虚函数在类中的函数以virtual开头的成员函数, 关键字virtual就是告诉编译器我们的这个函数是虚函数.virtual void print() { cout << "print"; }这就是一个虚函数, 只需要一个关键字就行了.下面分析会用到的例子class...原创 2019-01-22 12:01:46 · 505 阅读 · 2 评论 -
c++ 多态内存布局分析
前言上节对分析了多态的基本概念, 本节从内存布局的角度再来分析一下多态吧。单一继承的内存布局最开始我们分析了虚指针, 虚表, 但都只停留在单继承中, 现在我们在来扩展的探讨多重继承的内存布局#include <iostream>#include <stdlib.h>#include <cstring>#include <functional&原创 2019-01-22 12:04:08 · 1893 阅读 · 0 评论 -
decltype类型推导
前言如果想要知道一个表达式的数据类型但又不想对表达式进行求值, 那么auto似乎就不满足这中要求, c++11加入了decltype操作符,它的功能与auto类似, 都是进行类型推导, 但是decltype就能对某一表达式的类型进行推导并且不求表达式的值.因为decltype在很多的时候并不同于auto操作符, 所以我会将大部分的不同罗列出来, 比如 : 数组, 顶层const等.declt...原创 2019-01-20 12:08:49 · 617 阅读 · 0 评论 -
auto类型推导
引言auto : 类型推导. 在使用c++的时候会经常使用, 就像在考虑STL时迭代器类型, 写模板的时候使用auto能少写代码, 也能帮助我们避免一些隐患的细节.auto初始化使用auto型别推导要求必须在定义时初始化, 毕竟需要根据对象的类型推导左值对象的型别.auto j; // error. 必须初始化auto i = 0; // i 推导型别为 intvector<...原创 2019-01-17 22:22:58 · 826 阅读 · 0 评论 -
const浅析
前言c++中使用到const的地方有很多, 而且const 本身也针对不同的类型可能有不同的含义, 比如对指针就有顶层和底层. 本节就是探讨关于C++中const的在不同的地方不同表现或含义.const关于const :const修饰的对象一旦创建一般就不能改变, 所以对于const对象必须进行初始化.int i = 0;const int j; // error. 必须进行初始...原创 2018-12-13 13:59:57 · 1116 阅读 · 0 评论 -
template之类相关
前言前面两节主要分析了使用template的注意点以及非类型参数如何使用, 本节来探讨虚模板函数和模板拷贝构造函数.虚函数模板在我们使用模板从来都没有将虚函数与模板进行套用, 那么这两者能不能同时连用呢?这个直接来写代码验证才知道.class point{ public: template<class T> virtual T getX() { r...原创 2018-12-11 19:46:27 · 1047 阅读 · 0 评论 -
template之非类型模板参数
前言前一节分析了关于template的使用注意, 本节分析关于template非类型参数的使用, 非类型参数可能在有些人认为并没有太大作用, 但是既然C++规定有能这样使用就肯定有其意义, 这里就做一个浅析.非类型模板参数非类型参数, 可用在模板中自定义为整型类型, 指针或引用, 不能定义为浮点数等其他类型.非类型模板参数在编译期间就已经实例化, 所以其模板实参必须是常量表达式.temp...原创 2018-12-11 19:45:14 · 3764 阅读 · 0 评论 -
template之模板注意事项
前言在分析STL之前, 我们需要先对template做一个回忆, 可能我总结的内容你都会了, 也可能你没有了印象了, 但是我还是希望你先浏览一下template的用法. 毕竟STL全部都涉及到了模板, 而template是学习STL的基础.template使用template的使用大大提高了代码的复用性, 抽象性.类模板实例化时并不是每个成员函数都实例化了, 而是使用到了哪个成员函数, ...原创 2018-12-11 19:42:40 · 2074 阅读 · 1 评论 -
template之全特化和偏特化
前言关于讲过traits萃取器的时候探讨到偏特化的概念, 而在那一篇文章也没有具体解释偏特化是什么, 怎么实现, 所以可能在第一次看得时候会很莫名其妙. 所以我将偏特化放在其后讲解, 为不明白的朋友做一个浅析的讲解. 这里我先聊一下全特化再聊偏特化.全特化全特化的模板参数列表应该是为空, 函数和类都可以实现全特化.template&amp;lt;class T&amp;gt;void fun(T a)...原创 2018-12-04 10:13:05 · 2167 阅读 · 2 评论 -
template之模板中class与typename区别
前言在分析traits编程之前, 我们需要对模板参数类型tempname和class有一定的了解, 要明白他们在哪些方面不同, 哪些方面相同, 这样才能对体会到traits编程的核心. 如果你已经明白了两者, 那么你可以直接看下一篇了.相同之处一般对模板参数类型typename和class认为是一样的. 这两者在参数类型中确实是一样的. 你可以写成template&lt;class T&g...原创 2018-11-30 10:45:42 · 13431 阅读 · 1 评论 -
new实现
new实现前言本篇来分析new是怎么实现的, 使用c++进行在申请对象的时候用到new, 但是为什么申请对象要用到new, 而不能用malloc, 而有时申请数组的用new或者malloc似乎又都可以, 这里就来分析一下new实现.new operator, operator new以及placement newnew operator用法其实new operator我们经常在使用,...原创 2018-11-26 10:26:25 · 3585 阅读 · 2 评论 -
c++11 constexpr浅析
c++11 constexpr浅析引言在分析template实现返回数组的大小时遇到constexpr关键字, 又学到了很多有用的知识, 这里我将自己的查到的资料整理一下写下来.含义, 语法constexpr指定修饰对象或函数. 修饰一个常量表达式.const也是类似的功能, 修饰一个对象表示它是常量. 两者在描述上有一定的不同.const与constexpr两者对基本的区别....原创 2018-11-26 09:33:24 · 2329 阅读 · 0 评论 -
vargs 可变参数实现
vargs实现c语言的va_list可以传入多个参数, 而它的实现也是很简单, 很容易理解, 就是3个宏va_list实现typedef char * va_list;va_list是一个char *字符指针.va_start实现#define SIZEOF(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))#d...原创 2018-10-22 15:55:38 · 1175 阅读 · 1 评论 -
attribute属性
attribute属性__attribute__介绍attribute的格式.__attribute__((attribute-list))attribute属性可以在编译的时候告诉编译器函数, 结构体的属性是什么, 进行某些编译优化, 也可以提供更加准确的错误检查.attribute是GNU特有的特性这里主要说明attribute的4个属性, 分别是packed, aligned,...原创 2018-10-22 12:42:59 · 1423 阅读 · 0 评论 -
程序入口
程序的入口加载linux可执行文件都是通过调用execve函数来调用加载器的.加载器将可执行文件的代码和数据从磁盘拷贝到内存中, 然后通过第一条指令来查找程序运行的入口, 从而执行整个程序. 而将数据从磁盘复制到内存的过程就叫做加载.程序的入口通过从内核设置的第一条指令找到程序的入口, 一般gcc默认编译程序的入口是_libc_start_main这一个默认函数, 而默认函数的入口又是存...原创 2018-10-22 09:20:11 · 2147 阅读 · 2 评论 -
printf %m 分析
printf %m在了解printf源码的时侯, 突然发现的一个问题. 我在linux环境下写下面的代码时的结果让我很惊讶.#include &lt;stdio.h&gt;int main(){ printf("%m\n"); return 0;}运行结果rpz@funct:~$ ./a.out Success恩? 发现怎么回事儿 …...原创 2018-05-25 16:04:57 · 5034 阅读 · 2 评论 -
define理解
define用法define用法特殊符号: #特殊符号: ##换行符 : \特殊字符: #@这里主要探讨的是关于define的#, ##, #@, \ 这些特殊符号的意义.特殊符号: ## 运算符就是将传入的符号转换为字符串模式.#include <stdio.h>#include <stdlib.h>#d...原创 2018-05-21 14:05:57 · 692 阅读 · 0 评论