C++primer
hjhomw
今天的苦逼是为了不这样一直苦逼下去,坚持,坚持,坚持!
展开
-
constexpr和常量表达式
常量表达式(const expr)是指值不会改变并且在编译过程就能得到计算结果的表达式。显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。一个对象(或表达式)是不是常量表达式由它的数据类型和初始值共同决定,例如:const int max_files=20; //max_files是常量表达式const int limit=max_files+1; //limit原创 2015-08-24 18:12:15 · 770 阅读 · 0 评论 -
string和vector下标运算符
vector的size函数返回vector对象中元素的个数,返回值的类型由vector定义的size_type类型。要使用size_type,需首先指定它是由哪种类型定义的。vector对象的类型总是包含着元素的类型:vector<int>::size_type //正确vector::size_type //错误string对象和vector对象的下标运算符可用于访问已存在的元素,原创 2015-08-24 12:07:12 · 1654 阅读 · 0 评论 -
string::size_type类型
对于size函数来说,返回一个int或unsigned都是合情合理的。但其实size函数返回的一个string::size_type类型的值,下面就对这种新的类型稍作解释:string类以及大多数标准库类型都定义了几种配套的类型。这些配套的类型体现了标准库类型与机器无关的特性,类型size_type即是其中一种。在具体使用的时候,通过作用域操作符来表明名字size_type是在类s原创 2015-08-24 09:33:16 · 932 阅读 · 0 评论 -
空指针和void*指针
空指针空指针是不指向任何对象,在试图使用一个指针之前代码可以首先检查它是否为空。以下列出几个生成空指针的方法:int *p1=nullptr;int *p2=0;int *p3=NULL;得到空指针最直接的办法就是用字面值nullptr来初始化指针,这是C++11新标准引入的一种方法。nullptr是一种特殊类型的字面值,它可以被转换成任意其他的指针类型。另一种方法就如对p2的定义一样,也可以原创 2015-08-19 19:47:46 · 1116 阅读 · 0 评论 -
范围for语句
C++新标准提供的范围for语句.这种语句遍历给定序列中个元素并对序列中每一个值执行某种操作,其语法形式是: for(declaration : expression) statement 其中,expression 部分是一个对象,用于表示一个序列。declaration 部分负责定义一个变量,该变量将用于访问序列中的基础元素。每次迭代,declarati原创 2015-08-24 10:45:01 · 4938 阅读 · 1 评论 -
迭代器
所有标准库容器都可以使用迭代器,但是其中只有少数几种才支持下标运算符。迭代器有效和无效之分,这一点和指针差不多。有效的迭代器或者指向某个元素,或者指向容器中尾元素的下一个位置,其他情况都属于无效。和指针不一样,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员。比如这些类型都有名为begin和end的成员,其中begin成员负责返回指向第一个元素的迭代器,end成员负责返回指向容器“原创 2015-08-24 15:43:55 · 621 阅读 · 0 评论 -
空指针和void*指针
空指针不指向任何对象,在试图使用一个指针之前可以检查它是否为空。以下列出几个生成空指针的方法:int *p1=nullptr;int *p2=0;int *p3=NULL;得到空指针最直接的办法就是用字面值nullptr来初始化指针,这是C++11新标准引入的一种方法。nullptr是一种特殊类型的字面值,它可以被转换成任意其他的指针类型。另一种方法就如对p2的定义一样,也可以通过将指针初始化为原创 2015-08-24 15:50:56 · 725 阅读 · 1 评论 -
main:处理命令行选项
有时,我们需给main函数传递实参,一种常见的情况是用户通过设置一组选项来确定函数所要执行的操作、例如,假定main函数位于可执行文件prog之内,我们可以向程序传递下面的选项: prog -d -o ofile data0 这些命令行选项通过两个(可选的)形参传递给main函数:int main(int argc,char *argv[]){...}第二个形参是数组,它的元素是指向C风格字符串原创 2015-08-26 14:10:12 · 740 阅读 · 0 评论 -
函数指针
函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关。例如:bool lengthCompare(const string &,const string &);该函数的类型是bool(const string &,const string &).要想声明一个可以指向该函数的指针,只需用指针替换函数名即可://pf指向一个函数原创 2015-08-27 10:58:27 · 408 阅读 · 0 评论 -
C++中vector使用
转载: http://blog.chinaunix.net/uid-26000296-id-3785610.html转载 2015-08-30 10:10:02 · 266 阅读 · 0 评论 -
缓冲区刷新
缓冲刷新(即,数据真正写到输出设备或文件)的原因很多:程序正常结束,作为main函数的renturn操作的一部分,缓冲刷新被执行。缓冲区满时,需要刷新缓冲,而后新的数据才能继续写入缓冲区可以使用操纵符如endl来显示地刷新缓冲区在每个输出操作之后,可以用unitbuf设置流的内部状态,来清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的一个输出原创 2015-08-29 14:39:25 · 949 阅读 · 0 评论 -
定义和初始化vector对象
和任何一种类类型一样,vector模板控制着定义和初始化向量的方法。下面列出了定义vector对象的常用方法。**默认初始化**vector对象从而创建一个指定类型的空vector:vector<string> svec; //默认初始化,svec不含任何元素看起来空vector好像没什么用,但是很快我们就会知道程序在运行时可以很高效地往vector对象中添加元素。事实上,最常见的方式就是先定义一个原创 2015-08-30 10:00:57 · 7762 阅读 · 2 评论 -
std::remove_if
原型: #include forward_iterator remove_if( forward_iterator start, forward_iterator end, Predicate p );函数remove_if()移除序列[start, end)中所有应用于谓词p返回true的元素.此函数返回一个指向被修剪的序列的最后一个元素迭代器.记住,转载 2015-09-02 15:47:09 · 532 阅读 · 0 评论 -
注释简介
# 注释简介## C++中注释的种类2015/8/19 星期三 14:53:45 C++中有两种注释:单行注释和界定符对注释。单行注释以双斜线(//)开始,以换行符结束。当前行双斜线右侧的所有内容都会被编译器忽略,这种注释可以包含任何文本,包括额外的双斜线。另一种注释使用继承自C语言的两个界定符(/\*和\*/)。这种注释以/\*开始,以\*/结束,可以包含除*/外的任原创 2015-08-19 15:53:48 · 508 阅读 · 0 评论 -
使用文件重定向
当你测试程序时,反复从键盘上敲入数据作为程序的输入,是非常乏味的。大多数操作系统支持文件重定向,这种机制允许我们将标准输入和标准输出与命名文件关联起来:$ addItems outfile 假定$是系统提示符,我们的程序已经编译为名为addItems.exe的可执行文件(UNIX中是addItem),则将上述命令会从一个名为infile的文件读取数据,并将结果写入到一个名为outfile原创 2015-08-19 16:25:15 · 1223 阅读 · 3 评论 -
变量声明和定义的关系
为了允许吧程序拆分成多个逻辑部分来写,C++语言支持分离式编译机制,该机制允许将程序分割为若干个文件,每个文件可被独立编译。如果将程序分成多个文件,则需要有在文件间共享代码的方法。例如,一个文件的代码可能要使用另一个文件中定义的变量。一个实际的粒子是std::cout和std::cin它们定义于标准库,却能被我们写的程序所使用。为了支持分离式编译,C++语言将声明和定义区分开来。声明使得名原创 2015-08-19 19:27:06 · 443 阅读 · 0 评论 -
析构函数
当我们定义了类的一个对象时,就会隐式的调用构造函数,构造函数执行完成后,对象就有了资源。当我们不需要该对象时,即程序运行到对象作用域之外时,会隐式的调用析构函数,析构函数执行完成后,对象的资源就被释放。一、析构函数(deconstructor) 构造函数的英文名为constructor,它是起到构造对象的作用的函数。析构函数的英文名为deconstructor,析构函数的作用与构造函数的作用相转载 2015-09-11 09:50:30 · 1319 阅读 · 0 评论 -
赋值运算符
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。class CMyString{public:CMyString(char *pData=NULL);//构造函数CMyString(const CMyString& str);//拷贝构造函数~CMyString();//析构函数private:char* m_pData;//数据域,字符指针};介绍重载赋值转载 2015-09-11 10:00:28 · 437 阅读 · 0 评论 -
文本查询程序
#include <iostream>#include<vector>#include<map>#include<set>#include<sstream>#include<string>#include<memory>#include<fstream>using namespace std;using line_no=vector<string>::size_type;class原创 2015-09-07 09:36:36 · 409 阅读 · 0 评论 -
关于字符编码,你所需要知道的
字符编码的问题看似很小,经常被技术人员忽视,但是很容易导致一些莫名其妙的问题。这里总结了一下字符编码的一些普及性的知识,希望对大家有所帮助。还是得从ASCII码说起说到字符编码,不得不说ASCII码的简史。计算机一开始发明的时候是用来解决数字计算的问题,后来人们发现,计算机还可以做更多的事,例如文本处理。但由于计算机只识“数”,因此人们必须告诉计算机哪个数字来代表哪个特定字符,例如65代表字母‘A’转载 2015-09-11 14:18:25 · 442 阅读 · 0 评论 -
初始化器
初始化器在C/C99/C++中,初始化器是声明器的可选部分,它由一个’=’以及其后的一个表达式(或含有多个以’,’隔开的带圆括号表达式的单一列表)所组成。后面这一列表有时也被称为“初始化(器)列表”(initializer list)或”初始化列表”(initialization list),不过initializer list也是C++中用于初始化类或结构中的元素的保留字。 一个包含初始化的声明原创 2015-09-06 14:57:48 · 1345 阅读 · 0 评论 -
c/c++中几个重要的指针概念
彻底搞清c/c++中的几个指针概念:悬垂指针和智能指针以及哑指针和野指针 转载: http://blog.csdn.net/zhangyulin54321/article/details/7872972转载 2015-09-12 16:11:54 · 250 阅读 · 0 评论 -
C语言中的内存分布
讲的非常详细。 博客地址: http://blog.csdn.net/yanchengHUST/article/details/48344045?ref=myread转载 2015-09-12 16:13:57 · 234 阅读 · 0 评论 -
C++中this指针用法详解
this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。 例如,调用d转载 2015-09-12 19:06:14 · 397 阅读 · 0 评论 -
for循环的执行顺序
for循环的执行顺序用如下表达式:for(expression1;expression2;expression3) { expression4; } 执行的顺序应该是:1)第一次循环,即初始化循环。 首先执行表达式expression1(一般为初始化语句);再执行expression2(一般为条件判断语句),判断expression1是否符合expressio原创 2015-09-29 08:39:03 · 579 阅读 · 0 评论 -
Segmentation fault error及core dumped
Linux上开发时最恼火的就是遇到“Segmetation Fault”错误。为什么这么说,很多人看到这个错误后心里第一反应是程序访问的非法的内存,导致其被操作系统强行终止。这固然没错,可这里有个比较模糊的概念了:什么叫“非法”的内存?程序运行时,每个进程都有自己的虚拟地址,理论上说进程应该可以随便使用才对,为什么还会出现这个错误呢?这里就涉及到程序的装载过程及原理。 先澄清几个概念:程序:原创 2015-09-13 10:32:08 · 1002 阅读 · 0 评论 -
模版编译和头文件
当编译器遇到模版定义时,它并不生成代码。只有当我们实例化出模版的 一个特定版本时,编译器才会生成代码。当我们使用模版时,编译器才生成代码。通常调用一个函数时,编译器只需要掌握函数的声明。类似的,当我们使用一个类类型的对象时,类定义必须是可用的,但成员函数的定义不必已经出现。因将类定义和函数声明放在头文件中,而普通函数和类的成员函数的定义放在源文件中。模版则不同,为了生成一个实例化版本,编译器需要掌握原创 2015-09-29 15:00:32 · 356 阅读 · 0 评论 -
使用类的类型成员
通过作用域运算符(::)来访问static成员和类型成员。在普通(非模板)代码中,编译器掌握类的定义,因此它知道通过作用域运算符访问的名字是类型还是static成员。例如,如果我们写下string::size_type ;编译器有string的定义,从而知道size_type是一个类型。但对于模版代码就存在困难。例如,假定T是一个模板参数,当编译器遇到类似T::mem这样的代码时,它不会知道mem是原创 2015-09-30 10:33:21 · 665 阅读 · 0 评论 -
constexpr和常量表达式
常量表达式(const expression)是指值不会改变并且在编译过程就能得到计算结果的表达式。显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。后面将会提到,C++语言中有几种情况下是要用到常量表达式的。一个对象(或表达式)是不是常量表达式由它的数据类型和初始值共同决定,例如:const int max_files = 20; // max_files是原创 2015-09-29 15:56:46 · 414 阅读 · 0 评论 -
左值引用和右值引用的区别
左值引用,也就是“常规引用”,不能绑定到要转换的表达式,字面常量,或返回右值的表达式。而右值引用恰好相反,可以绑定到这类表达式,但不能绑定到一个左值上。右值引用就是必须绑定到右值的引用,通过&&获得。右值引用之恩那个绑定到一个将要销毁的对象上,因此可以自由地移动其资源。返回左值的表达式包括返回左值引用的函数及赋值,下标,解引用和前置递增/递减运算符,返回右值的包括返回非引用类型的函数及算术,关系,位原创 2015-09-15 20:12:30 · 5471 阅读 · 0 评论 -
C++命名空间
本讲基本要求掌握:命名空间的作用及定义;如何使用命名空间。了解:使用早期的函数库重点、难点 ◆命名空间的作用及定义;如何使用命名空间。 在学习本书前面各章时,读者已经多次看到在程序中用了以下语句:using namespace std;这就是使用了命名空间std。在本讲中将对它作较详细的介绍。一、 为什么需要命名空间(问题提出) 命名空间是ANSIC++引入的转载 2015-10-01 16:59:05 · 388 阅读 · 0 评论 -
类的定义中不能包含其自身类型,但是能包含其自身的指针和引用类型
类的声明 就像把类的声明和定义分开来一样,我们也能仅仅声明类而暂时不定义它: class Simple; 这种声明有时被成为前向声明,它向程序中引入了名字Simple并且指明Simple是一种类类型。对于类型Simple来说,在它声明之后定义之前是一个不完全类型,此时我们知道它是一个类类型,但是不清楚它到底包含哪些成员。不完全类型只能在非常有限的情况下使用:可以定义指向这种类型的指针和引用()原创 2015-09-14 21:03:33 · 1236 阅读 · 0 评论 -
C++中#ifdef#endif
一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。 条件编译命令最常见的形式为: #ifdef 标识符 程序段1 #else 程序段2 #endif它的作用是:当标识符已经被定义过(一般是用#define命令定义转载 2015-09-15 21:15:09 · 429 阅读 · 0 评论 -
Linux系统的头文件和库文件搜索路径
Include的header文件,连结数据库,系统定义,总共有下列来源指定gcc去那找。当初在编译时指定的(在~gcc/gcc/collect2.c:locatelib()写在specs内的后来用-D -I -L指定的gcc环境变量设定(编译的时候)ld.so的环境变量(这是run time的时候)一、头文件gcc 在编译时如何去寻找所需要的头文件 :※所以header file的搜寻会从-I开始※转载 2015-10-02 22:04:51 · 965 阅读 · 0 评论 -
C++的头文件
一、C++编译模式 通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称作C++头文件,里面放的也是C++的源代码。C+ +语言支持“分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。.cpp文件里的东西都是相对独立的转载 2015-09-16 08:33:08 · 538 阅读 · 0 评论 -
bind1st bind2nd详解
先不要被吓到,其实这两个配接器很简单。 首先,他们都在头文件中定义。 其次,bind就是绑定的意思,而1st就代表first,2nd就代表second,现在名在可以很快记住了。 再次,他们的申明是一样的,都是(const Operation& op, const T& x)。简单的说,bind1st(const Operation& op, const T& x)就是这么一个操作:x op v转载 2015-09-17 22:07:07 · 819 阅读 · 0 评论 -
函数指针和指针函数
一、在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义:1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y);首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回转载 2015-09-18 09:42:15 · 262 阅读 · 0 评论 -
从命令行运行程序
为了在windows中运行一个可执行文件,需要提供可执行文件的文件名,可以忽略其扩展名.exe$ prog1在一些系统中,即使文件就在当前目录或文件夹中,也必须显示地指出文件的位置。在此情况下,可以键入$ .\prog1“.”后跟一个反斜线指出文件在当前目录中。为了一UNIX系统中运行一个可执行文件,必须使用全文件名名,包括扩展名$ a.out如果需要指定文件位置,需要用一个“.”后跟一个斜线来指出原创 2016-03-16 09:51:58 · 1320 阅读 · 0 评论 -
c++中endl与“\n”的区别
在c++中,终端输出换行时,用cout<<……<< endl 与 “\n”都可以,这是初级的认识。但二者有小小的区别,用endl时会刷新缓冲区,使得栈中的东西刷新一次,但用“\n”不会刷新,它只会换行,栈内数据没有变化。 但一般情况,二者的这点区别是很小的,在大的程序中可能会用到。建议用endl来换行.endl除了写’\n’进外,还调用flush函数,刷新缓冲区,把缓冲区里的数据写入文件转载 2016-03-16 10:25:49 · 377 阅读 · 0 评论 -
字符集与编码方式解惑
1、什么是【locale】?【locale】指一个程序或者操作系统所处的国家、字符集、时间显示的格式、货币符号等。在C标准库的locale.h文件中定义了常量LC_ALL(全部locale项)、LC_COLLATE(排序)、LC_CTYPE(语言符号)、LC_MESSAGES、LC_MONETARY(货币符号)、LC_NUMERIC、LC_TIME(日期格式)等。locale是linux系统和C语言转载 2016-03-16 14:46:37 · 473 阅读 · 0 评论