![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
freshman94
这个作者很懒,什么都没留下…
展开
-
C++构造函数、析构函数与抛出异常
构造函数可以抛出异常无论何时,从构造函数中抛出异常都是可以的。动态创建对象要进行两个操作:分配内存和调用构造函数。若在分配内存时出错,会抛出bad_alloc异常;若在调用构造函数初始化时出错,不会存在内存泄漏。new运算符保证不会出现内存泄漏:void allocate_and_construct(){ // 第一步,分配原始内存,若失败则抛出bad_alloc异常 tr...原创 2019-03-24 19:47:51 · 367 阅读 · 0 评论 -
C++ 11 新特性:可调用对象与function
可调用对象C++ 中有几种可调用的对象:函数、函数指针、lambda表达式、重载了函数调用运算符的函数对象类以及bind创建的对象(可以将bind函数看作一个通用的函数适配器,这接受一个可调用对象,生成一个新的可调用对象来”适应“原对象的函数列表)。//普通函数int add(int i, int j) { return i + j; }//lambda,产生一个未命名的函数对象类aut...原创 2019-04-20 22:14:25 · 429 阅读 · 0 评论 -
C++ 11 新特性:override和final指示符
虚函数的override和final指示符派生类如果定义了一个函数与基类中虚函数的名字相同但是形参列表不同,这仍然是合法的行为。编译器将认为新定义的这个函数与基类中原有的函数是相互独立的,这时派生类的函数并没有覆盖掉基类中的版本。但这种声明往往意味着发生了错误,因为我们原本可能希望派生类能覆盖掉基类中的虚函数,但是不小心把形参列表弄错了。我们可以在派生类的虚函数使用override关键字,显式...原创 2019-04-20 22:33:55 · 360 阅读 · 0 评论 -
C++ 11 新特性:随机数库
在C++11之前,C和C++都依赖于函数rand来生成随机数。此函数生成均匀分布的伪随机整数,每个随机数的范围在0和一个系统相关的最大值(至少为32767)之间。rand函数有一些问题:很多程序需要不同范围的随机数,一些应用需要非均匀分布的数。而程序员为了解决这些问题而试图转换rand生成的随机数的范围、类型或分布时,常常会引入非随机性。定义在头文件random中的随机数库通过一组协作的类来解...原创 2019-04-21 12:09:55 · 1536 阅读 · 0 评论 -
assert预处理宏和NDEBUG预处理变量
assert预处理宏assert是一种预处理宏原创 2019-04-17 09:33:59 · 366 阅读 · 0 评论 -
C++ 11新特性:枚举类型
枚举类型属于字面值常量类型,用于将一组整型常量组织在一起,每个枚举类型定义了一种新的类型。C++包含两种枚举:限定作用域的和不限定作用域的。定义限定作用域的枚举类型的一般形式是:enum calss(或 enum struct)枚举类型名 {..., ...};定义不限定作用域的枚举类型时省略掉关键字class(或 struct)。如果enum是未命名的,则我们只能在定义该enum时定义它...原创 2019-04-21 22:43:46 · 2705 阅读 · 0 评论 -
C++ 11 新特性: auto和decltype
auto类型说明符C++11 新标准引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。使用auto也能在一条语句中声明多个变量。因为一条声明语句只能有一个基本数据类型,所以该语句所有变量的初始基本数据类型都必须一样:auto sz = 0, pi = 3.14; //错误:sz和pi的类型不一致由于上面的语句,推导出变量的类型可能为int或double,因此编译器...原创 2019-04-17 10:45:40 · 180 阅读 · 0 评论 -
C++ 11 新特性: 标准库函数begin和end、sizeof运算符
标准库函数begin和end为了让指针的使用更简单,更安全,C++11引入了两个函数:begin和end,这两个函数定义在iterator头文件中。它们的正确使用形式是将数组作为它们的参数:int ia[] = {0,1,2,3,4,5,6,7,8,9};int *beg = begin(ia); //指向ia首元素的指针int *end = end(ia); //指向ia尾元素的下...原创 2019-04-17 16:05:01 · 583 阅读 · 0 评论 -
C++ :引用折叠和显式模板实参
为了理解引用折叠,我们给出下面的例子:template <typename T> void f(T&&);f(i);假定 i 是一个 int 对象,我们可能认为 f(i) 这样的调用是不合法的。毕竟,i 是一个左值,而通常我们不能将一个右值引用绑定到一个左值上。但是,C++在正常绑定规则之外定义了两个例外规则,允许这种绑定。第一个例外规则:当我们将一个左值传...原创 2019-04-18 10:40:31 · 330 阅读 · 0 评论 -
C++ 11 新特性:可变形参
为了编写能够处理不同数量形参的函数,C++11提供了两种主要的方法:如果所有形参的类型相同,可以传递一个名为initializer_list的标准库类型如果形参的类型不同,可以使用可变参数模板C++还有一种特殊的形参类型:省略符,可以用它传递可变数量的实参。不过需要注意的是,这种功能一般只用于与C函数交互的接口程序。initializer_list形参如果函数的形参数量未知但全部形参...原创 2019-04-18 11:51:49 · 1622 阅读 · 1 评论 -
C++ 11 新特性: std::array和std::forward_list
std::arraystd::array是C++11新增加的类型。与内置数组相比,array是一种更安全、更容易使用的数据类型,定义于头文件<array>中。与内置数组类似,array对象的大小是固定的,因此,array不支持添加和删除元素以及改变窗口大小的操作。而且它不会退化成指针。从cppreference.com得知其定义为:template< class ...原创 2019-04-18 21:26:09 · 1222 阅读 · 0 评论 -
C++ 11 新特性:容器的非成员函数swap
除aary外,交换两个容器内容的操作保证会很快------元素本身并未被交换,swap只是交换了两个容器的内部数据结构。元素不会被移动的事实意味着,除string外,指向窗口的迭代器、引用和指针在swap操作之后都不会失效。它们仍指向swap操作之前所指向的那些元素,只是这些元素已经属于不同的容器了。与其它容器不同,对一个string调用swap会导致迭代器、引用和指针失效。swap两个arra...原创 2019-04-18 21:49:13 · 876 阅读 · 0 评论 -
C++:函数返回值与临时变量
C++规定当函数返回的是非引用类型时,函数会创建临时对象(temporary object),函数返回的就是这个临时对象。在求解表达式时,如果需要一个地方存储其运算结果,编译器会创建一个没有命名的对象,这就是临时对象。浅显的说,当你调用了函数,函数会 return一个值 那么这个值总得有存放的地方吧,编译器就把会把值存放在一个没有命名法临时对象中。我们举个例子来说明一下,首先定义一个类:cl...转载 2019-05-05 20:28:13 · 8999 阅读 · 3 评论 -
函数返回值作为左值问题
C++语言的函数返回值类型可以分为内部类型和自定义类型两大类。如果函数返回内部类型并且希望返回值可以作为左值(即可以放在赋值操作符左边的),那就必须返回引用类型。而在函数返回自定义类型(即返回类类型)中根据是否可作为左值,返回值是否可调用成员函数的不同可分为以下四种情况。T f(): 返回一般的类类型,返回的类类型不能作为左值,但返回的类类型可以直接调用成员函数来修改,如function(...转载 2019-05-05 20:45:55 · 8007 阅读 · 3 评论 -
C++反射机制的实现
转载于: https://blog.csdn.net/Scythe666/article/details/51718864Java中有天然的反射机制,因为Java本身就是半编译语言,很多东西可以在运行时来做,但是c++就不同了。要建立c++的反射机制,就需要登记每个类名与 创建类实例的回调函数 的对应关系。前言首先抛出一个问题:如何通过类的名称字符串来生成类的对象。比如有一个类ClassA,...转载 2019-04-30 17:59:15 · 34311 阅读 · 5 评论 -
C++ 11 新特性:标准库move函数
标准库move函数我们可以通过调用std::move函数来获得绑定到左值上的右值引用,此函数定义在头文件<utility>中。std :: move用于指示对象obj可以“移动”,即允许资源从obj到另一个对象的有效传输。注意,对move我们不应该使用using声明,而是应该直接调用std::move而不是move,以避免名字冲突。int && rr3 = std:...原创 2019-04-20 21:47:36 · 6467 阅读 · 0 评论 -
C++ 11 新特性: constexpr变量和constexpr函数
constexpr变量字面值类型包括算术类型、引用、指针、枚举和数据成员都是字面值类型的聚合类。聚合类的定义:所有成员都是public的。没有定义任何构造函数。没有类内初始值。没有基类,也没有虚函数。如:struct Data { int ival; string str;};常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。字面值属于常量表达式,用常量...原创 2019-04-16 17:07:46 · 10281 阅读 · 0 评论 -
C++ 运行时类型识别 RTTI
运行时类型识别(RTTI)功能由两个运算符实现typeid运算符,用于返回表达式的类型dynamic_cast运算符,用于将基类的指针或引用安全地转换成派生类的指针或引用特别适用于以下情况:想用基类的指针或引用执行某个派生类的非虚函数。一般来说,只要有可能应尽量使用虚函数。dynamic_castdynamic_cast<type*>(e)dynamic_cast<...原创 2019-03-24 19:53:01 · 476 阅读 · 0 评论 -
浅谈C++类型转换的安全性
const_castconst_cast能经由指针或引用,改变对象的底层const。如果对象本身是指针或引用,对象的底层是const,则使用强制类型转换获得写权限是合法的行为#include<iostream>using namespace std;int main() { const char str[] = "hello"; char* c = const_cast&l...原创 2019-03-21 15:00:25 · 2033 阅读 · 0 评论 -
C++11的6种内存序
简介编译器的优化会产生乱序指令,cpu也会因为指令流水线优化产生乱序指令。当然这些乱序指令都是为了同一个目的,优化执行效率 。这里解释下两个词的含义:happens-before:按照程序的代码序执行synchronized-with:不同线程间,对于同一个原子操作,需要同步关系,store操作一定要先于 load,也就是说 对于一个原子变量x,先写x,然后读x是一个同步的操作,读x并不...原创 2019-03-25 20:25:29 · 3849 阅读 · 0 评论 -
gcc的原子操作
原子操作__sync_系列提供加减和逻辑运算的原子操作type __sync_fetch_and_add (type *ptr, type value, ...)type __sync_fetch_and_sub (type *ptr, type value, ...)type __sync_fetch_and_or (type *ptr, type value, ...)type __...原创 2019-03-25 21:31:32 · 8622 阅读 · 0 评论 -
__builtin_expect的作用
将流水线引入cpu,可以提高cpu的效率。更简单的说,让cpu可以预先取出下一条指令,减少cpu等待取指令的耗时,从而可以提供cpu的效率。如果存在跳转指令,那么预先取出的指令就无用了。cpu在执行当前指令时,从内存中取出了当前指令的下一条指令。执行完当前指令后,cpu发现不是要执行下一条指令,而是执行offset偏移处的指令。cpu只能重新从内存中取出offset偏移处的指令。因此,跳转指令会...转载 2019-04-04 16:46:55 · 8969 阅读 · 0 评论 -
C/C++知识小记
glibcglibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。syscall()syscall() 执行一个系统调用,根据指定的参数number和所有系统调用的汇编语言接口来确定调用哪个系统调用。例子:获取线程ID,gettid()#include <sys/syscall.h>tid = sy...原创 2019-04-04 16:47:33 · 240 阅读 · 0 评论 -
Linux多线程服务端编程学习(八):压力测试
本篇文章将测试网络库的吞吐量和并发事件处理效率,源码的地址为:https://github.com/freshman94/NetLib用ping pong协议测试网络库在单机上的吞吐量简单地说,ping pong协议是客户端和服务器都实现echo协议。当TCP连接建立时,客户端向服务端发送一些数据,服务器会echo回这些数据,然后客户端再echo回服务器。这些数据就会像乒乓球一样在客户端和服务...原创 2019-04-01 11:02:53 · 383 阅读 · 0 评论 -
C++实现LRU
LRU缓存算法也叫LRU页面置换算法,是一种经典常用的页面置换算法LRU的典型实现是hash map + doubly linked list,双向链表用于存储数据结点,并且它是按照结点最近被使用的时间来存储的。如果一个结点被访问了,我们有理由相信它在接下来的一段时间被访问的概率要大于其它结点。于是,我们把它放到双向链表的头部。当我们往双向链表里插入一个结点,我们也有可能很快就会使用到它,同样把...原创 2019-04-01 12:10:52 · 2188 阅读 · 0 评论 -
Linux多线程服务端编程学习(七):TCP客户端的设计
前文一般是由客户端主动发起连接,而主动发起连接就比被动接受连接要复杂一些,一方面是错误处理麻烦,另一方面是要考虑重试。发起连接的基本方式是调用connect,当socket变得可写时,表明连接建立完毕,但其中要处理各种错误,要判断连接是否建立成功。实现中我们将其封装为Connector类,需要注意的几个地方是:用于建立连接的socket是一次性的,一旦出错,就无法恢复,只能关闭重来。但Co...原创 2019-03-29 09:43:03 · 240 阅读 · 0 评论 -
C++实现LRU(最久未使用)缓存算法
LRU缓存算法也叫LRU页面置换算法,是一种经典常用的页面置换算法。LRU的典型实现是hash map + doubly linked list,双向链表用于存储数据结点,并且它是按照结点最近被使用的时间来存储的。如果一个结点被访问了,我们相信它在接下来的一段时间被访问的概率要大于其它结点。于是,我们把它放到双向链表的头部。当我们往双向链表里插入一个结点,我们也有可能很快就会使用到它,同样把它插...原创 2019-04-12 19:23:49 · 252 阅读 · 0 评论 -
C++宏(Macro)的各种玩法
本文转载于http://orzz.org/cxx-macro-play/一、普通玩法1. 基本功能定义一个宏来替换字符串:#define MACRO_PRINTF printf这样我们使用MACRO_PRINTF就如同printf一样。我们还可以像这样定义一个宏名称,但不写任何东西:#define MACRO_NAME然后像这样通过预定义的开关来调整代码实现:#ifdef ...转载 2019-04-12 19:50:45 · 10867 阅读 · 0 评论 -
关于C++“字符指针”的初始化
使用strcpy函数#include <stdio.h>#include<string.h>int len(char*a) { printf("%s\n", a); return strlen(a);}int main(){ char*t[4]; char a[4]; const char*c = "asd"; s...原创 2019-04-12 19:53:00 · 2256 阅读 · 0 评论 -
C++中string、char *、char[]的转换
本文转载于https://www.cnblogs.com/Pillar/p/4206452.html一、string转char*主要有三种方法可以将str转换为char*类型,分别是:data(); c_str(); copy();1. data()方法string str = "hello";const char* p = str.data();//加const 或者用char * p...转载 2019-04-12 20:00:53 · 297 阅读 · 0 评论 -
变量的内存释放顺序
局部变量的释放先于全局变量和静态变量。而局部变量之间,静态变量之间,全局变量之间的以及静态变量与全局变量之间的内存释放顺序依然遵循后声明先释放的次序...原创 2019-04-12 20:03:05 · 950 阅读 · 0 评论 -
Visual Studio 2017 安装Windows SDK10.0.17134.0 失败的解决办法
当我们安装成功了VS2017时,当我们要编译我们的代码时,我们会发现出错了:找不到Windows SDK 10.0.17134.0这时,我们需要安装SDK,下载地址为:https://developer.microsoft.com/zh-cn/windows/downloads/windows-10-sdk下载至默认路径即可,安装成功后,打开Visual Studio Installer,它会...转载 2019-05-06 15:51:26 · 3506 阅读 · 1 评论