![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++相关
文章平均质量分 65
Memaxwell
To be creative,and make changes;什么限制了你的想象力;直面缺点(定义它|顺从它|克服它)
展开
-
补码原码反码
一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1、机器数一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。那么,这里的 00000011 和 10000011转载 2016-10-24 11:37:28 · 337 阅读 · 0 评论 -
条款03:尽可能使用const
将某些东西声明为const可以帮助编译器发现错误;const可以施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体编译器强制实行bitwise constness(物理常量性),而我们的程序应该坚持逻辑常量性(conceptual constness)当const、non-const成员函数有实质相同的实现的时候,可以用non-const版本调用const版本从而便面代码重复原创 2017-12-01 15:13:03 · 141 阅读 · 0 评论 -
条款04:确定对象被使用前已经先被初始化
为内置类型对象手工初始化,因为C++不保证初始化他们构造函数最好使用构造函数初始值列表,而不要在构造函数体内使用赋值操作,初值列列出的成员变量其次序应该与类中声明次序相同为了免除‘’跨编译单元之初始化次序‘’问题,请以local static对象替换non-local static对象读取未初始化值会导致不明确行为:int x;在不同位置会出现不同行为,对于内置类型来说,如果在全局作用域声明,原创 2017-12-04 10:22:39 · 230 阅读 · 0 评论 -
条款05:了解C++默默编写并调用那些函数
请记住:编译器可以为class创建default构造函数、copy构造函数、copy assignment 操作符,以及析构函数当C++处理之后一个空类就不再为空,如果没做任何声明,那么编译器可以为class创建default构造函数、copy构造函数、copy assignment 操作符,以及析构函数,并且所有这谢函数都是public且为inline。class E原创 2017-12-05 15:51:34 · 191 阅读 · 0 评论 -
条款06:对于不希望自动生成的函数就应该明确拒绝他
为了驳回编译器自动提供的技能,可将响应的函数声明为private并且不予实现,也可以使用像Uncopyable这样的baseclass/*对于你所设计的类,如果你希望每个对象独一无二只有一份,自然不希望copy构造函数或者 copy assinment构造函数,那么你就应该拒绝编译器为你自动生成,方法有以上所述的两种,*/原创 2017-12-05 16:15:33 · 112 阅读 · 0 评论 -
条款07:对多态基类声明虚析构函数
polymorphic(带多态性质)的base classes应该声明一个虚析构函数;如果base classes 带有任何析构函数,那么就该声明一个虚析构函数classes的设计目的如果不是作为base classes使用,或者不具备多态性质,就不应该声明虚析构函数对于多态基类,由于可能存在用基类指针指向派生类对象,并经由此基类指针delete,如果没有声明虚析构函数,就会造成只delete基类原创 2017-12-05 17:21:58 · 116 阅读 · 0 评论 -
条款08:别让异常逃离析构函数
析构函数绝对不能抛出任何异常,如果一个被析构函数调用的函数可能会抛出异常,析构函数应该能够捕捉任何异常,然后吞下他们(不传播),或者结束程序。 如果客户需要对某个操作函数运行期间抛出的异常作出反应,那么classe应该提供一个普通函数执行(而非析构函数)该操作列子:一个负责数据库连接的class class DBConnection{ public: ... static原创 2017-12-21 09:04:52 · 126 阅读 · 0 评论 -
C++
C++ 虽然有这样那样的缺点,但是不得不说有一些精妙的小玩意让人爱不释手,为什么不考这些东西: references;RAII;smart points;move semantics;monomorphization;memory model;C++ 的特色是什么?精准的生命周期,明确的资源所有权(当然 Rust 做得更好,不论),不强行为用户钦定(说得就是钦定 GC 等)(多风格随便选,没人转载 2017-12-06 15:42:16 · 164 阅读 · 0 评论 -
auto和decltype
auto 指定符(C++11 起): 对于变量,指定其类型将从其初始化器自动推导而出。 对于函数,指定其返回类型是尾随的返回类型或将从其 return 语句推导出 (C++14 起)。 对于非类型模板形参,指定其类型将从参数推导出。 (C++17 起) 语法auto variable initializer (1) (C++11 起)auto func原创 2017-12-07 11:07:54 · 366 阅读 · 0 评论 -
关于extern "c"的用法解析(转载)
引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。 extern “C”的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern “C”后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此转载 2018-01-03 13:16:28 · 205 阅读 · 0 评论 -
C++的模板
模板是C++泛型编程的基础,是编译器生成函数或者类的蓝图或者说公式定义函数模板:template <typename T>//T是模板参数,可以有一个或者多个int compare(const T& ctv1,const T &ctv2){ if(ctv1<ctv2) return -1; if(ctv2<ctv1) return 1; return 0;}实例化函数模原创 2017-12-08 17:28:33 · 230 阅读 · 0 评论 -
关于constexpr与const
C++之父是这样解释二者的: const:大致意思是说我承诺不改变这个值,主要用于说明接口,这样变量传递给函数就不担心变量会在函数内被修改了编译器负责确认并执行const的承诺。 constexpr:大致意思是在编译时求值,主要用于说明常量,作用是允许数据置于只读内存以及提升性能。按照这种说法,我的理解是const大多用于接口中,声明不对传入的参数做修改,而constexpr多用于编译原创 2017-12-05 14:23:28 · 10975 阅读 · 1 评论 -
Google编程风格指南(一):头文件相关
避免多重包含,用预编译宏 #ifndef ... #define ... ... #endif头文件命名最好以其所在项目源代码树的全路径,例如: 项目foo中的头文件foo/src/bar/baz.h #ifndef FOO_BAR_BAZ_H_ #define FOO_BAR_BAZ_H_ ... #endif 2 . 使用前置声明,原创 2017-12-20 08:23:16 · 193 阅读 · 0 评论 -
C++ primer 第二章
学习一门编程语言要理解语法特征的实现细节 * 内置类型 * 变量 用来为对象命名 * 表达式和语句 操纵上述数据类型 * if while 控制结构 * 函数 * 扩充:两种机制* 1. 程序员自定义数据类型 2. 封装成库函数供程序员调用 C++是静态数据类型语言,类型检查发生在编译时 数据类型是程序的基础:他告诉我们数据的意义和可以执行的操作基本内置类型2.1原创 2016-10-24 11:04:47 · 347 阅读 · 0 评论 -
c++primer 第三章数组 string vector
命名空间的using声明使用using格式: using namespace::name; example: using std::cin; 头文件不应包含using声明3.2 string 3.2.1 定义和初始化 方式: string s1;//默认初始化,其为一个空串 string s2=s1; string s3(s1);原创 2016-10-25 08:56:42 · 223 阅读 · 0 评论 -
c++primer第四章 表达式
左值、右值: 当一个对象被当做右值的时候使用的是对象的值(内容),当对象被用作左值的时候用的是对象的身份(内存); 原则:在使用右值的地方可以用左值代替,但是不能把右值当成左值(也就是位置)使用。当一个左值被用工作右值时,实际上使用的是她的内容(值)。 1.赋值运算需要一个左值作为左侧运算对象,得到结果仍然是左值 2. 取地址符作用于一个左值对象,返回一个指向该对象的指针,这个指针是右值原创 2016-10-28 01:22:02 · 270 阅读 · 0 评论 -
c++ primer--第六章 函数
函数是一个命名了的代码块,可以重载函数,也就是同一个名字对应不同的函数 6.1函数基础 返回类型 、函数名 、 0个或者多个形参列表 、函数体 我们通过调用运算符来执行函数,函数调用完成两项工作:一是用实参初始化函数对应的形参,二是将控制权转移给被调用函数;执行函数第一步是定义并初始化形参;遇到一条return语句时结束函数;return语句也完成两项工作:一是返回return语句中的值,原创 2016-10-30 11:57:02 · 187 阅读 · 0 评论 -
C++primer 语句
可以在if switch while for 语句的控制结构内定义变量。定义在控制结构当中的变量只在相应语句内部可见,一旦语句结束,变量也就超出其作用范围了控制结构定义的对象的值马上使用所以必须初始化 switch语句提供了一条便利的途径使得我们能偶在若干固定选项中做出选择。case标签必须是整形常量表达式 **如果在某处带有一个初始值的变量位于作用于之外,在另一处该变量位于作用域之内,则从原创 2016-10-28 17:43:38 · 188 阅读 · 0 评论 -
c++ primer--第七章 类
c++中使用类定义自己的数据类型。 数据抽象帮助将对象的具体实现与对象能执行的操作分离开来 类的基本思想是数据抽象和封装。 数据抽象是一种依赖于接口和实现分离的编程技术类的接口包括用户所能执行的操作;类的实现包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数封装实现了类的接口和实现的分离类要实现数据抽象和封装,必须首先定义一个抽象数据类型7.1定义抽象数据类型原创 2016-11-02 15:42:20 · 390 阅读 · 0 评论 -
c++点滴
数组名作为函数参数传递时自动退化为指针: int Getsize(int data[]) { return sizeof(data);//得到结果是4:一个指针的大小 }int _main(int argc, _TCHAR * argv[]) { int data1[]={1,2,3,4,5}; int size1=sizeof(data1);//得到2原创 2016-12-19 22:29:15 · 236 阅读 · 0 评论 -
关于string的方方面面
string表示可变长的字符序列:定义和初始化:string s1;//默认初始化string s2(s1);//s2是s1的副本string s2=s1;//等价于s2(s1)string s3("value");//字面值的副本string s4(n,'c');//n个c//容器定义和初始化,大多数可以适用于stringC c;C c1(c2);C c1=c2;C原创 2018-01-17 08:55:52 · 149 阅读 · 0 评论