
C++学习杂项
记录C++初学者一点一滴的学习历程
so~what
这个作者很懒,什么都没留下…
展开
-
C++程序员应了解的那些事(53)C++中的name mangling
基本支持函数重载的语言都需要进行name mangling。mangling的目的就是为了给重载的函数不同的签名,以避免调用时的二义性调用。C++程序员需要感谢GNU,GNU BinUtils的工具链用起来实在是太舒服了。(1)先定义两个简单的函数:double sum(double x,double y){ return double();} void foo(int lhs,int rhs){}g++ -c mangling.cc -o mangling...原创 2020-10-27 21:21:16 · 331 阅读 · 0 评论 -
c++编译中出现‘vtable for ***未定义的引用解决办法
1、对‘vtable for Brass’未定义的引用class Brass:public AcctABC{public: Brass(const std::string & s="Nullbody",long an=-1, double bal=0.0):AcctABC(s,an,bal){} virtual void Withdraw(double amt); virtual void ViewAcct()原创 2020-10-13 21:51:26 · 22325 阅读 · 1 评论 -
C++ 中 # 和 ## 和 #@ 的用法说明
例如宏定义如下:#define Conn(x,y) x##y#define ToChar(x) #@x#define ToString(x) #x【1】x##y表示什么?表示x连接y,举例说:int n = Conn(123,456); 结果就是n=123456;char* str = Conn("asdf", "adf")结果就是 str = "asdfadf";【2】对于#@x,其实就是给x加上单引号,结果返回是一个const char。举例说:char a = ...原创 2020-10-10 22:23:38 · 1795 阅读 · 0 评论 -
c语言strcpy()函数 会拷贝’\0’结束符
c语言strcpy()用法strcpy,即string copy(字符串复制)的缩写。strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有’\0’结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。//C语言标准库函数strcpy的一种最简实现//返回值:目标串的地址//对于出现异常的情况ANSI-C99标准并未定义,故由实现者决定返回值,通常为NULL//参数:des为目标字符串,source为原字符串 char* strcpy(char* d原创 2020-09-13 10:31:44 · 13410 阅读 · 0 评论 -
GCC 内嵌汇编语法详解+visual studio code实操
开发Arm程序的时候,大多数时候使用C/C++语言就可以了,但汇编语言在某些情况下能够实现一些C语言无法实现的功能,这时候就要调用一些汇编语言的程序.我们需要大概了解一下在C语言中如何嵌入汇编语言。《1》内嵌汇编语法如下: __asm__(汇编语句模板: 输出部分: 输入部分: 破坏描述部分)共四个部分:汇编语句模板,输出部分,输入部分,破坏描述部分,各部分使用“:”格开,汇编语句模板必不可少,其他三部分可选,如果使用了后面的部分,而前面部分为空,也需要用“:”格开...原创 2020-09-06 09:50:17 · 3189 阅读 · 1 评论 -
如何在C语言中嵌入汇编
C语言怎样嵌入汇编:TIPS:在编译过程汇中,汇编代码块是原封不动地送到汇编语言编译阶段的。一、为什么会用到汇编?1.为了提高速度和效率。不过这种情况很少了,现在C/C++编译器的优化很厉害了。2.为了实现某些C语言中不具备、但为不同的机器所特有的功能。这是主要原因。3.为了利用通用的汇编语言例程。也常会遇到。二、何时使用汇编?第一种情况是,绝对没有其他方法可以使用。第二种情况出现在某个C语言程序的执行时间必须减少的时候。三、如何嵌入汇编?【Turbo C】:1.使用预处理程序的伪指令#a.原创 2020-09-03 22:19:40 · 7543 阅读 · 1 评论 -
C++ 虚函数能否是内联的(虚函数用于运行时多态,内联函数用于提高程序的效率)
<示例>#include <iostream>using namespace std;class Base{public: virtual void who() { cout << "I am Base\n"; }};class Derived: public Base{public: void who() { cout << "I am Derived\n"; .原创 2020-08-21 23:21:13 · 275 阅读 · 0 评论 -
C++规范编码引涉语法点之(7)静态分配和动态分配/堆和栈
【1】内存的静态分配和动态分配的区别主要是两个: 一是时间不同。静态分配发生在程序编译和连接的时候。动态分配则发生在程序调入和执行的时候。 二是空间不同。堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由函数malloc进行分配。不过栈的动态分配和堆不同,他的动态分配是由编译器进行释放,无需我们手工实现。【2】对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。 ...原创 2020-07-13 23:13:22 · 434 阅读 · 0 评论 -
什么是类型安全,C/C++是类型安全的吗?
【1】首先:C/C++不是类型安全的语言。类型安全是指同一段内存在不同的地方,会被强制要求使用相同的办法来解释(内存中的数据是用类型来解释的)。//类型安全性意味着编译器将在编译时验证类型,如果尝试将错误的类型分配给变量,则抛出错误。Java语言是类型安全的,除非强制类型转换。C语言不是类型安全的,因为同一段内存可以用不同的数据类型来解释,比如1用int来解释就是1,用boolean来解释就是true。------------------------------------------------原创 2020-07-13 22:12:15 · 5979 阅读 · 0 评论 -
C++规范编码引涉语法点 之(6)在构造函数和析构函数中,在function-try-block的处理程序中捕获的异常必须重新抛出
<1>写出下面代码并分析存在的问题#include<iostream>using namespacestd;class BaseClass{ public: BaseClass() { }};class MyClass:public BaseClass{private: char*ptr;public: MyClass();};MyClass::MyClass():BaseClass(),ptr(newchar原创 2020-07-11 10:33:37 · 303 阅读 · 0 评论 -
(n&(n-1))==0的具体含义及应用扩展
<1>【(n&(n-1))==0含义解析】检查n是否为2的n次方 (n&(n-1))==0表示n和n-1不存在同一位均为1的情况:<2>【n & n-1 应用】n & n-1 会把数字中最后等于1 的数字抹掉1100 & 1011 == 1000 把第二位上的1 给去掉了1011 & 1010 == 1010 最后一位的0抹掉了利用这点我们可以如下应用<1>...原创 2020-07-09 20:22:18 · 2191 阅读 · 0 评论 -
C++规范编码引涉语法点 之(5)不要在STL容器中存储 auto_ptr 对象 & auto_ptr的缺陷
【导入】使用auto_ptr类的限制(auto_ptr的缺陷)1)不要使用auto_ptr对象保存指向静态分配对象的指针,否则,当auto_ptr对象本身被撤销的时候,它将试图删除指向非动态分配对象的指针,导致未定义的行为。2)永远不要使用两个 auto_ptrs 对象指向同一对象,导致这个错误的一种明显方式是,使用同一指针来初始化或者 reset 两个不同的 auto_ptr对象。另一种导致这个错误的微妙方式可能是,使用一个 auto_ptr 对象的 get 函数的结果来初始化或者 reset另一个原创 2020-07-09 19:56:26 · 397 阅读 · 0 评论 -
C/C++指针极简入门
1. 初识指针 简单来说,指针是一种特殊的变量。特殊在于,这种变量存储的不是普通值(比如1,2,100,‘q’);它存储的是内存地址,比如0x101、0x886等。 我们都知道,变量的存储是需要占用内存空间的。 图中,Age是一个变量,它的存放地址是0x886,存放的值是18。 pAge是一个指针,也可以说是一个特殊的变量。它的存放地址是0x601,存放的内容是0x886。对比,很容易发现,指针和变量有很多相似之处;不同之处在于,指针存放的是内存...原创 2020-07-08 21:33:18 · 176 阅读 · 0 评论 -
C++11中的std::call_once 使用举例 + 实现Singleton模式程序示例
某些场景下,我们需要代码只被执行一次,比如单例类的初始化,考虑到多线程安全,需要进行加锁控制。C++11中提供的call_once可以很好的满足这种需求,使用又非常简单。#include<mutex>template <class Fn, class... Args>void call_once (once_flag& flag, Fn&& fn, Args&&...args); 第一个参数是std...原创 2020-07-01 22:20:27 · 3035 阅读 · 0 评论 -
C++11 std::chrono时间库及应用(打印程序耗时等)
(1)chrono命名空间定义好的时间单位: typedef duration <Rep, ratio<3600,1>> hours; typedef duration <Rep, ratio<60,1>> minutes; typedef duration <Rep, ratio<1,1>> seconds; typedef duration <Rep, ratio<1,1000>>原创 2020-06-30 23:26:58 · 14978 阅读 · 0 评论 -
C++规范编码引涉语法点 之(4)C/C++中的顺序点和副作用
C/C++中有一个叫做顺序点(Sequence Point)的概念,通常我们并没有必要去了解和深究。但如果掌握了顺序点的概念,一些晦涩的表达式(比如某些无聊的面试题目)可能就会变得简单明了了。为了介绍顺序点,就不得不提到副作用(Side Effect)。(1)、副作用(side effect) 表达式有两种功能:每个表达式都产生一个值( value ),同时可能包含副作用( side effect )。副作用是指改变了某些变量的值。如:1:20 //这个表达式的值是20;...原创 2020-06-29 23:53:58 · 262 阅读 · 0 评论 -
C++规范编码引涉语法点 之(3)静态变量初始化问题
【1】C++函数内的静态变量初始化以及线程安全问题(1)如果是编译时和加载时初始化, 是不会存在线程安全问题的; 因为这两种初始化一定发生在Main函数执行之前, 这个时候尚未进入程序运行空间; 而这些初始化一定是在单线程环境下操作的! 都是在执行C Runtime的startup代码中的void mainCRTStartup(void)函数时所在的OS系统加载程序时的主线程空间上发生的!(2)如果是运行时初始化, 因为无法保证访问这个静态变量所在的局部函数/全局函数/类成员函...原创 2020-06-28 21:26:13 · 540 阅读 · 0 评论 -
C++规范编码引涉语法点 之(2)自定义字面量 + operator “” _xxx(const char *, size_t n) +
从C++11开始,我们可以使用以下形式通过常量字符串构造自定义类型, 比如:class Person{public: Person(const std::string& name): _name(name){} std::string name() const { return _name; }private: std::string name;}inline Person operator "" _psn (const char *原创 2020-06-22 19:57:00 · 629 阅读 · 0 评论 -
C++规范编码引涉语法点 之(1):std::enable_if
std::enable_if 顾名思义,满足条件时类型有效。作为选择类型的小工具,其广泛的应用在 C++ 的模板元编程(meta programming)中。它的定义也异常的简单:template <bool, typename T=void>struct enable_if {}; template <typename T>struct enable_if<true, T> { using type = T;}; ...原创 2020-06-21 23:24:10 · 274 阅读 · 0 评论 -
cin 输入方法详解:
【前导】 cin 输入操作原理: 输入操作的原理与之前提到的scanf函数一样,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入。[1]cin>>该操作符是根据后面变量的类型读取数据。输入结束条件:遇到Enter、Space、Tab键(这个很重要!) 。...原创 2020-06-19 22:14:05 · 4689 阅读 · 0 评论 -
C++ STL vector:sizeof(vector)的大小
(1)int的大小是4,定义vector<int>vec,vec中有一个元素,sizeof(vec)=20,如果有1000个元素,则sizeof(vec)是多少?#include <iostream>#include <vector>using namespace std;int main(){ vector<int> vec; for(int i=0;i<100;i++) { vec.push_back(i); co.原创 2020-05-14 22:36:56 · 4451 阅读 · 0 评论 -
C++ 拷贝构造函数和赋值构造函数的区别 !
1. 何时调用复制构造函数 复制构造函数用于将一个对象复制到新创建的对象中。也就是说,它用于初始化过程中,而不是常规的赋值过程中。类的复制构造函数原型通常如下: class_name(const class_name&); 它接受一个指向类对象的常量引用作为参数。例如,String类的复制构造函数的原型如下: String(const String&); 新建一...原创 2020-04-26 22:19:28 · 4570 阅读 · 0 评论 -
C++ 内置类型和类类型的默认初始化和值初始化
如果定义变量时候没有指定初值,则变量被默认初始化。 但是默认初始化还有另外一个含义,在定义内置类型时由于定义变量的位置不同,有可能会不发生初始化操作(这种情况下称为默认初始化),也有可能会给定一个初值(称为值初始化)。 由上,个人琢磨其实默认初始化可以分为两种①不发生初始化操作的默认初始化 ② 值初始化(如果没有给定一个初始值,就会根据变量或类对象的...原创 2020-04-25 09:26:50 · 2277 阅读 · 1 评论 -
dci::Unknown介绍
来源 DCI in C++ [推荐阅读]https://www.jianshu.com/p/bb9c35606d29 DCI框架中提供的一种RTTI的替代工具,它可以模仿完成类似dynamic_cast的功能,但是无需在编译选项中开启RTTI功能。这样当我们想要在代码中小范围使用该特性的时候,就不用承担整个版本都因RTTI带来的性能损耗。利用这种替代技术,可以让程序员精...原创 2020-03-26 12:36:08 · 361 阅读 · 0 评论 -
STL算法积累(二)
C++ sortstable_sortpartial_sortnth_elementis_sortedis_sorted_until[1]C++ sort(STL sort)排序算法详解 //默认升序1.1 在很多应用中,排序都是至关重要的,而且很多 STL 算法也只适用于有序对象序列。定义在 algorithm 头文件中的函数模板 sort<Iter>() ...原创 2020-02-26 21:24:03 · 255 阅读 · 0 评论 -
STL泛型算法积累(一)
(1)原创 2020-02-23 20:21:07 · 174 阅读 · 0 评论 -
小类,大对象:C++
小类,大对象:C++原文链接 https://www.jianshu.com/p/6a8d72b3bf48背景时至今日,C++的核心战场在于:对于性能,空间和实时性有高要求的系统。而在这类系统上,也有其特定的约束和挑战: 在这类系统上,内存管理始终是个需要关注的问题。而通用内存管理算法,要么容易导致内存碎片,要么会导致内存浪费。而为了避免这样的问题,最好是自己定义内存管理器...原创 2020-02-23 20:20:50 · 708 阅读 · 0 评论 -
C++11常用特性的使用经验总结
出处http://www.cnblogs.com/feng-schttps://www.cnblogs.com/bluebean/p/5721686.html C++11已经出来很久了,网上也早有很多优秀的C++11新特性的总结文章,在编写本博客之前,博主在工作和学习中学到的关于C++11方面的知识,也得益于很多其他网友的总结。本博客文章是在学习的基础上,加上博主在日常工作中的使用C+...原创 2020-02-23 20:09:09 · 141 阅读 · 0 评论 -
a=a+b 与a+=b 的一些对比
1、a=a+b的含义:变量a开辟一片内存单元,把某个数字存入到内存单元中,然后把这个数取出到CUP中进行计算(加b),然后存回到原内存单元中。2、+=操作符会进行隐式自动类型转换,此处 a+=b隐式的将加操作的结果类型强制转换为持有结果的类型,而a=a+b则不会自动进行类型转换3、a += b直接在a中加了ba = a + b则是用一个临时变量temp记录a的值,类似过程:temp =...原创 2019-12-17 09:12:58 · 1184 阅读 · 0 评论 -
不要让copy和copy assignment相互调用,哪怕有代码重复的部分
copyassignment函数和copy构造函数 这两个copying的数往往有近似相同的实现本体,这可能会诱使你让某个的数调用另一个函数以避免代码重复。这样精益求精的态度值得赞赏,但是令某个copying函数调用另一个copying函数却无法让你达到你想要的目标。 令copyassignment操作符调用copy构造函数是不合理的,因为这就像试图构造一个已经存在...原创 2019-12-17 21:11:27 · 352 阅读 · 0 评论 -
map的vale是一个函数时,如何调用
#include <string>#include <stdio.h>#include <iostream>#include <functional>#include <map>void func_handleMessage(){ std::cout<< "call Text_MessageServic...原创 2020-02-23 19:59:09 · 151 阅读 · 0 评论 -
自定义比较函数用 函数对象或lamda表达式 代替比较函数
【1】说明:在使用stl库中的查找和排序时,往往会使用自定义比较函数。使用函数对象的方式比传输函数指针的方式具有更好的性能。lamba表达式的行为类似于带有()运算符的函数对象,性能均优于比较函数。引申——斯特潘诺夫的抽象惩罚:C++标准库提供的直接可用的算法和数据结构,能适用于很多情况,但即使是最优秀的标准库算法,往往无法与最佳的手工编写算法匹敌。即为斯特潘诺夫的抽象惩罚。...原创 2019-11-09 18:54:24 · 1196 阅读 · 0 评论