cpp trick
文章平均质量分 59
cpp常用技巧
infralan
Major in 存储, 周边:linux内核 虚拟化 云原生,分布式、网络、数据库
展开
-
gdb查看继承链内存布局demo1
gdb查看继承链内存布局demo1实验1让我引入两个新的类。一个基类Person和一个从Person继承的派生类Student。请注意,两者都使用其方法who()的相同签名。有了虚函数多态的动态分派后,将查询vtable并调用适当的方法。如果没有虚函数,则将调用与对象的指针类型匹配的方法。 Student *m将调用Student:: who(),而Person *p将调用Person::who()。让我们用汇编代码验证一下。#include <stdio.h>class Pe原创 2021-07-10 13:01:06 · 488 阅读 · 0 评论 -
传数组防止引用退化
传数组防止引用退化如下定义就得到一个数组的引用类型名 (&变量名)[N];在进行参数的传递时,数组引用可以帮助我们防止数组退化为指针,而这是我们在编程中很难注意到的问题。下面来看一个实例:#include <iostream>void each(int int_ref[10]){ std::cout << sizeof(int_ref) << std::endl; for (int i = 0; i < 10; i++)原创 2021-07-09 22:36:26 · 245 阅读 · 0 评论 -
cpp中三种多态
cpp中三种多态多态(Polymorphism)是一个大家耳熟能详的概念。在传统的C++教学中,我们通常认为“多态”是函数在类继承体系中所表现出来的一种行为。比如,在下面的例子中,template <typename T> T convertFromInt(int v);void f1() { convertFromInt<float>(5); convertFromInt<double>(5);}struct Base { virt原创 2021-07-08 21:27:27 · 955 阅读 · 0 评论 -
RTTI实现机制demo
RTTI实现机制RTTI是Runtime Type Identification的缩写,意思是运行时类型识别。C++引入这个机制是为了让程序在运行时能根据基类的指针或引用来获得该指针或引用所指的对象的实际类型。但是现在RTTI的类型识别已经不限于此了,它还能通过typeid操作符识别出所有的基本类型(int,指针等)的变量对应的类型。C++通过以下的两个操作提供RTTI:(1)typeid运算符,该运算符返回其表达式或类型名的实际类型。(2)dynamic_cast运算符,该运算符将基类的指针或引用原创 2021-07-08 21:17:55 · 264 阅读 · 0 评论 -
局部静态变量
局部静态变量局部静态变量更像是全局静态变量的一个语法糖一样的存在,只不过编译器会自动添加检查语句来将它的初始化延迟到对应函数的第一次调用时。 需要注意的是,一般的函数局部变量是放在栈上的,而局部静态变量是在 BSS 里的。extern inline§7.1.2/4 C++03 / C++11 / C++14A static local variable in an extern inline function always refers to the same object.很明确,如果是 ext原创 2021-07-08 20:36:15 · 282 阅读 · 0 评论 -
std::shared_ptr简单用法demo
std::shared_ptr简单用法定义于头文件 <memory>增加计数被引用则会增加计数#include <iostream>#include <memory>using namespace std;int main(){ std::shared_ptr<string> sp = std::make_shared<string>(10, 'a'); std::shared_ptr<string>原创 2021-07-08 20:08:41 · 695 阅读 · 1 评论 -
namespace demo
C++中的namespace demonamespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的namespace,但是由于现在的程序的规模越来越大,程序的分工越来越细,全局作用域变得越来越拥挤,每个人都可能使用相同的名字来实现不同的库,于是程序员在合并程序的时候就会可能出现名字的冲突。namespace引入了复杂性,解决了这个问题。namespace允许像类,对象,函数聚集在一个名字下。本质上讲namespace是对全局作用域的细分。我想大家都见过这样的程序吧://hello_原创 2021-07-08 11:38:40 · 189 阅读 · 0 评论 -
继承体系内指针的比较
继承体系内指针的比较前言有人说指针是C语言的灵魂,也有人说没学好指针就等于不会C语言。虽然在现代C++中一般都是推荐尽量避免使用原生的raw指针,而是以smart pointer 和reference替代之。但是无论怎样,对于C/C++来说,指针始终是个绕不过去的坎。究其原因,是因为C/C++都是支持面向底层操作的语言,而面向底层操作就得能操纵内存,这个时候就需要指针了。为什么呢?个人觉得指针实际上就是对机器语言/ASM中的通过虚拟地址操作内存的这一行为的一种抽象。例如movl %eax, (%e原创 2021-07-07 19:28:44 · 272 阅读 · 0 评论 -
cin不读入空白字符
cin不读入空白字符In ASCII, whitespace characters are space ( ’ ’ ), tab ( ‘\t’ ), carriage return ( ‘\r’ ), newline ( ‘\n’ ), vertical tab ( ‘\v’ ) and formfeed ( ‘\f’ ).ASCII中的空白字符:,\t,\r,\n,\v,\f。cin only reads up to but not including the first whitespace ch原创 2021-07-05 00:05:54 · 708 阅读 · 0 评论 -
bind引用传参
bind引用传参std::bind的函数参数默认使用的是拷贝, 如果需要使用引用,则需要配合std::ref。下面一个例子,帮助理解。print2函数负责输出参数的值,且参数都是引用, print2函数内完成对参数的自增#include <functional>#include <iostream>void print2(int& a, int& b){ std::cout << "calling: a=" << a <原创 2021-07-03 21:49:53 · 1119 阅读 · 0 评论