C++入门
zl908760230
遇到问题首先得学会自己找答案!
展开
-
(54)const与define的特点和区别
(1)#define只是用来做文本替换的,#define 常量是一个Compile-Time概念,它的生命周期止于编译器,它存在于程序的代码段,在实际程序中它只是一个常数、一个命令中的参数,并没有实际存在。(2) const常量存在于程序的数据段,并在堆栈分配了控件。const常量是一个Run-Time的概念,它在程序中确确实实存在着并可以被调用、传递。const常量有数据类型,而宏常转载 2017-05-31 17:54:22 · 424 阅读 · 0 评论 -
(34)返回类型和return语句
return语句终止当前正在执行的函数并将控制权返回到调用该函数的地方。return语句的两种形式: return; return expression;无返回值函数没有返回值的return语句只能用在返回类型是void的函数中。返回void的函数不要求非得有return语句,因为在这类函数的最后一句后面会隐式地执行return. 通常情况下,void函数如果原创 2016-11-19 22:26:28 · 912 阅读 · 0 评论 -
(33)含有可变形参的函数
为了编写能处理不同数量实参的函数,C++提供了两种主要的方法:一.如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型二.提供一种特殊的形参类型(即省略符),可以用它传递可变数量的实参。这种功能一般只用于与C函数交互的接口程序initializer_list形参 如果函数的实参数量未知但是全部实参的类型相同,我们可以使用initializer原创 2016-11-17 22:16:09 · 325 阅读 · 0 评论 -
(32)参数传递
参数传递方式每次调用函数时都会重新创建它的形参,并用传入的实参对形参进行初始化,和其他变量一样,形参的类型决定了形参和实参交互的方式。当形参是引用类型时,我们说它对应的实参被引用传递或者函数被传引用调用。当实参的值被拷贝给形参时,形参和实参是两个相互独立的对象。我们说这样的实参被值传递或者函数被传值调用。一.传值参数 1.函数对形参做的所有操作不会影响实参。 2.当原创 2016-11-17 21:15:48 · 303 阅读 · 0 评论 -
(14)标准库类型vector
标准库类型vector表示对象的集合,其中所有对象的类型相同。集合中每个对象都有一个与之相对应的索引。索引用于访问对象。因为vector容纳着其他对象,所以它也常常被称作容器。想使用vector必须包含其头文件和using声明:#includeusing std::vector;vector ivec; //ivec 保存int类型的对象vector能容纳绝大多数类型的对象原创 2016-11-02 12:22:45 · 263 阅读 · 0 评论 -
(13)处理string对象中的字符
如果了解单个字符的特性,可以使用cctype头文件中的函数:处理每个字符:使用基于范围的for语句范围for()语句,遍历给定序列中的每个元素并对序列中的每个值执行某种操作。语法形式:string str("helloworld");for(auto c : str){cout<<c<<endl; //输出str中的每个字符,并且后面跟着一个换行符。}原创 2016-11-01 20:58:40 · 255 阅读 · 0 评论 -
(31)函数基础
函数函数是一个命名了的代码块,我们通过调用函数执行相应的代码。函数可以有0个或多个参数,而且(通常)会产生一个结果。可以重载函数,也就是说,同一个名字可以对应几个不同的函数。一个典型的函数定义包括以下部分:返回类型、函数名字、由0个或多个形参组成列表以及函数体,形参以逗号隔开位于圆括号内。我们通过调用运算符来执行函数。调用运算符的形式是一对圆括号,它作用于一个表达式,该表达式是函数原创 2016-11-13 22:37:57 · 430 阅读 · 0 评论 -
(10)头文件和注释
头文件:确保头文件对此包含仍能安全工作的常用技术是预处理技术。它是C++从C语言继承而来,预处理器是在编译之前执行的一段程序,可以部分的改变我们所写的程序,之前已经使用的一项预处理功能#include,当预处理器看到#includde标记时就会用指定头文件的内容代替#include.C++程序还会用到的一项预处理功能是头文件保护符,头文件保护符依赖于预处理变量。预处理变量有原创 2016-10-31 10:29:38 · 607 阅读 · 0 评论 -
(12)标准库类型string
标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件。作为标准库的一部分,string定义在命名空间std中。如:#includeusing std::string;定义和初始化string对象:如何初始化类的对象是由类本身决定的。一个类可以定义很多种初始化对象的方式,只不过这些方式之间必须有所区别:或者是初始值的数量不同,或者是初始值的类型原创 2016-11-01 15:38:11 · 267 阅读 · 0 评论 -
(46)类的静态成员
我们通过在成员的声明之前加上关键字static使得其与类关联在一起。和其他成员一样,静态成员可以是public的或private的。静态数据成员的类型可以是常量、引用、指针、类类型等。和其他的成员函数一样,我们既可以在类的内部也可以在类的外部定义静态成员函数。当在类的外部定义静态成员时,不能重复static关键字,该关键字只出现在类内部的声明语句类似于全局变量,静态数据成员原创 2016-11-29 11:15:21 · 281 阅读 · 0 评论 -
(30)try语句块和异常处理
异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。当程序的某部分检测到一个它无法处理的问题时,需要用到异常处理。异常处理机制为程序中异常检测和异常处理这两部分的协作提供支持。在C++语言中,异常处理包括:一.throw表达式,异常检测部分使用throw表达式来表示它遇到了无法处理的问题。我们说throw引发了异常。二.try语句块,异常处理部分使用try语句处理异常。t原创 2016-11-13 14:02:14 · 3434 阅读 · 0 评论 -
(11)命名空间using声明
使用命名空间的优缺点:优: 命名空间可以帮助我们避免不经意的名字定义冲突,以及使用库中相同名字导致的冲突,缺: 当使用标准库中的一个名字时必须显式的说明我们想使用来自命名空间std中的名字如:std::cout。在helloWorld那一节我写过 using namespace std;这样一条语句,这是声明名为std的命名空间。使用using声明是一种最简单,原创 2016-11-01 13:32:25 · 253 阅读 · 0 评论 -
(35)函数重载
如果同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载函数,main函数不能重载。对于重载的函数来说,它们应该在形参数量或形参类型上有所不同。不允许两个函数除了返回类型外其他所有的要素相同。重载和const形参一.顶层const不影响传入函数的对象。一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来二.如果形参是某种类型的指针或引用,原创 2016-11-20 14:08:14 · 261 阅读 · 0 评论 -
(36) 默认实参、内联函数和constexpr函数
默认实参某些函数有这样一种形参,在函数的很多次调用中他们都被赋予一个相同的值,我们把这个反复出现的值称为函数的默认实参,调用含有默认实参的函数时,可以包含该实参,也可以省略该实参。形式如下:typedef string::size_type sz;string screen(sz ht =24,sz wid =80,char backgrnd =' ');默认实参作为形参的初始值出现原创 2016-11-21 12:09:26 · 345 阅读 · 0 评论 -
(47)IO类
标准库使我们能忽略这些不同类型的流之间的差异,这是通过继承机制实现的。由于不能拷贝IO对象,因此我们不能将形参或返回类型设置为流类型。进行IO操作的函数通常以引用方式传递和返回流。读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的。下图列出了IO类所定义的一些函数和标志,可以帮助我们访问和操纵流的条件状态。 管理输出缓存 每个输原创 2016-12-05 17:45:37 · 312 阅读 · 0 评论 -
(53)用在宏上的#符号
(1) # 把宏参数变为一个字符串(2) ## 把宏参数贴合在一起#includeusing namespace std;#define str(s) #s#define cons(a,b) (int)(a##e##b)void main() { cout << str(vck) << endl; cout << cons(2, 3)原创 2017-05-31 16:47:58 · 326 阅读 · 0 评论 -
(6)C++变量
变量是什么?变量是一个具名的、可供程序操作的存储空间。变量定义的基本形式: 一个类型说明符和一个或多个变量名组成的列表,其中变量名以逗号隔开,最后以分号结尾,如:int a,b,c,d; 定义了变量的类型不仅定义了变量的内容,还定义了这个变量可以进行的运算。 在变量定义的同时,还可以为这个变量赋初值。那初值是什么,初值是初始值的简称。当变量在创建时获得了一原创 2016-10-24 20:13:34 · 471 阅读 · 0 评论 -
(52)顺序容器操作
顺序容器与关联容器的不同之处在于两者组织元素的方式。除了array之外,所有标准库容器都提供了灵活的内存管理。在运行时可以动态添加或删除元素来改变容器的大小。使用push_back除array和forward_list之外,每个顺序容器(包括string类型)都支持push_back。容器元素是拷贝:当我们用一个对象来初始化容器时,或将一个对象插入到原创 2017-03-25 21:21:58 · 250 阅读 · 0 评论 -
(51)容器库概览
一般来说,每个容器都定义在与其名称相同的头文件中。顺序容器几乎可以保存任意类型的元素。特别是我们可以定义一个容器,其元素的类型是另一个容器,例如: vector> lines;迭代器与容器一样,迭代器有着公共的接口:如果一个迭代器提供某个操作,那么所有提供相同操作的迭代器对这个操作的实现方式都是相同的。注意:forwar_list迭代器不支持递减运算原创 2017-03-24 19:31:17 · 310 阅读 · 0 评论 -
(50)顺序容器概述
顺序容器为程序员提供了控制元素存储和访问顺序的能力。但是,这些容器在以下方面都有不同的性能折中:1)向容器添加或从容器中删除元素的代价2)非顺序访问容器中元素的代价string和vector将元素包存在连续的内存空间中。由于元素是连续存储的,由元素的下标来计算其地址是非常快速的。但是,在这两种容器的中间位置添加或删除元素就会非常耗时,因为需要移动插入/删除位置之后的所有原创 2017-03-24 14:30:50 · 218 阅读 · 0 评论 -
(5)C++基本类型
在我们了解C++内置类型之前,需要对计算机基本类型有一定的了解。什么是位,字节,字,字长,字符?位(bit):是电子计算机中最小的数据单位。每一位的状态只能是0或1,简写:b。字节(Byte):8个二进制位构成1个字节,它是存储空间的基本计量单位,大小 0-255 简写:B。字:由若干个字节构成,不同档次的机器有不同的字长。例如一台8位机,它的1个字就等于1个字节,字长为8原创 2016-10-23 22:02:33 · 750 阅读 · 0 评论 -
(39)函数指针
函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关。当我们把函数名作为一个值使用时,该函数自动地转换成指针。直接使用指向含税的指针调用该函数,无须以前解引用指针。在指向不同函数类型的指针间不存在转换规则。但是和往常一样,我们可以为函数指针赋给一个nullptr或者值为0的整箱常量表达式表示该指针没有指向任原创 2016-11-27 14:03:10 · 296 阅读 · 0 评论 -
(38)函数匹配
函数匹配的步骤:第一步是选定本次调用对应的重载函数集,集合中的函数被称为候选函数。候选函数的特征:一.与被调用的函数同名二.其声明在调用点可见第二步是考察本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,这些新选出的函数称为可行函数。可行函数的特征:一.其形参数量与本次调用提供的实参数量相等二.每个实参的类型与对应的形参类型相同,或者能转换成形参的原创 2016-11-26 21:54:30 · 420 阅读 · 0 评论 -
(37)调试帮助
C++程序员有时会用到一种类似于头文件保护的技术,以便有选择地执行调试代码。程序可以包含一些用于调试的代码,但这些代码只在开发程序时使用。当应用程序编写完成准备发布时,要先屏蔽掉调试代码。这种方法用到两种预处理功能:assert和NDEBUG。assert预处理宏assert是一种预处理宏。所谓预处理宏其实是一个预处理变量,它的行为有点类似于内联函数。assert宏使用一个表达原创 2016-11-26 21:21:45 · 245 阅读 · 0 评论 -
(49)string流(缺)
sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,从string读取数据,就像string是一个IO流一样。 istringstream从string流读取数据,ostringstream向string写入数据,而头文件stringstream既可以从string读取数据也可以向string写数据。这个我也没怎么搞懂,等日后原创 2016-12-08 20:23:52 · 199 阅读 · 0 评论 -
(48)文件输入输出
头文件fstream定义了三个类型来支持文件IO:ifstream从一个给定文件读取数据,ofstream向一个给定文件写入数据,以及fstream可以读写给定文件。当我们想要读写一个文件时,可以定义一个文件流对象,并将对象与文件关联起来,创建文件流对象时,我们可以提供文件名(可选的)。如果提供 了一个文件名,则open会自动被调用:ifstream in(ifile);原创 2016-12-05 19:18:43 · 409 阅读 · 0 评论 -
(45)聚合类、字面值常量类
聚合类聚合类使得用户可以直接访问其成员,并且具有特殊的初始化语法形式。当一个类满足如下条件时,我们说它是聚合的:一.所有成员是public的二.没有定义任何构造函数三.没有类内初始值四.没有基类,也没有virtual函数如:struct Data{ int ival; string s;}我们可以提供一个花括号括起来的成员初始值列表,并用它初始原创 2016-11-29 09:35:33 · 759 阅读 · 3 评论 -
(29)跳转语句
跳转语句中断当前的执行过程,C++语言提供了4种跳转语句:break、continue、got和return.这节主要介绍前三个。break语句break语句负责终止离他们最近的while、do while、for和switch语句,并从这些语句之后的第一条语句开始继续执行。如:int i=1;while(i!=21){ i++; break;}原创 2016-11-12 15:56:36 · 389 阅读 · 1 评论 -
(22)赋值运算符、递增和递减运算符
赋值运算符:赋值运算符的左侧对象必须是一个可修改的左值。相应的,结果的类型就是左侧运算对象的类型。如果复制运算符的左右两个运算对象类型不同,则右侧运算对象将转换成左侧运算对象的类型。允许使用花括号括起来的初始值列表作为赋值语句的右侧运算对象:k = {1};无论左侧运算对象的类型是什么,初始值列表都可以为空。此时,编译器创建一个值初始化的临时量并将其赋给左侧运算对象。原创 2016-11-06 20:05:34 · 430 阅读 · 0 评论 -
(21)算术运算符、逻辑和关系运算符
算术运算符:作用于算术类型或者指针类型。一元运算符的优先级最高,接下来是乘除,最低是加减。除非另做特殊说明,算术运算符都能作用于任意算术类型以及任意能转换为算术类型的类型。算术运算符的运算对象和求值结果都是右值。一元运算符作用于指针或者算术值时,返回运算对象值的一个(提升后的)副本。算术表达式有可能产生未定义的结果:一.数学性质本身:除数不能0二.计算机的特原创 2016-11-06 19:16:49 · 1480 阅读 · 0 评论 -
(20)表达式
表达式有一个或多个运算对象组成,对表达式求值将得到一个结果,字面值和变量是最简单的表达式,其结果就是字面值和变量的值。把一个运算符和一个或多个运算对象组合起来可以生成较复杂的表达式。C++定义了一元运算符和二元运算符。作用于一个运算对象的运算符是一元运算符,如&,*作用于二个运算对象的运算符是二元运算符,如+,-既能作为一元运算符也能作为二元运算符,如*作用于三个运算对原创 2016-11-06 12:48:16 · 288 阅读 · 0 评论 -
(19)多维数组
严格来说,C++语言不存在多维数组,通常所说的多维数组其实是数组的数组。当一个数组的元素仍然是数组时,通常使用两个维度来定义它:一个维度表示数组本身大小,一个维度表示其元素(也是数组)大小。对于二维数组来说,常把第一个维度称作行,第二个维度称作列。多维数组的初始化:允许使用花括号括起来的一组值初始化多维数组:int a[2][2]={{1,2}{3,4}};其中内层原创 2016-11-05 22:39:07 · 262 阅读 · 0 评论 -
(18)C风格字符串与旧代码的接口
字符串字面值是一种通用结构的实例,这种结构即是C++由C继承而来的C风格字符串。C风格字符串不是一种类型,而是为了表达和使用字符串而形成的一种约定俗成的写法。按此习惯书写的字符串存放在字符数组中并以空字符结束。一般利用指针来操作这些字符串。C语言标准库提供的一组函数,这些函数可用于操作C风格字符串,它们定义在cstring头文件中,cstring是C语言头文件string.的C++版本。原创 2016-11-05 16:12:09 · 391 阅读 · 0 评论 -
(4)C++编译原理
C++的编译原理(Windows系统内)C++程序从源文件到可执行程序大致要经历三个步骤: 源文件(cpp)->目标程序(obj)->可执行程序(exe)我们在VS2015里面新建的后缀名为cpp文件就是我们常说的源文件,当创建了一个或多个源文件,编译后没有代码错误,源文件将会编译成为一个或多个目标程序,后缀名为obj。在这个过程中C++原创 2016-10-23 19:54:02 · 515 阅读 · 0 评论 -
(3)C和C++的区别!
C和C++的区别是什么?我们常听到听到的C和C++的区别就是:c是面向过程的编程语言,C++是面向对象的的编程语言。我觉得这种说法不绝对。在说之前,我们需要了解一下C++的发展历史,C++是怎么产生的呢?在C语言普遍应用的美国,随着程序员利用C开发的深入,发现C语言存在着一些缺陷(如类型检查机制较弱,缺少支持代码重用的语言结构等)造成了用C语言开发大型程序比较困难。如果让C程序员抛原创 2016-10-23 11:58:18 · 459 阅读 · 0 评论 -
(17)指针和数组
在C++语言中,指针和数组有非常紧密的联系,使用数组的时候编译器一般会把它转换成指针。对数组的元素使用取地址符就能得到指向该元素的指针。数组有一个特性:在多数用到数组名字的地方,编译器都会自动的将其替换为一个指向数组首元素的指针。当使用数组作为一个auto变量的初始值时,推断得到的类型是指针而非数组。当使用decltype关键字时上述转换不会发生,decltype返回的类型仍然是数原创 2016-11-03 16:34:16 · 375 阅读 · 0 评论 -
(16)数组
在对数组进行列表初始化时,允许忽略数组的维度。编译器会根据初始值数量计算并推测出来。如果指明了维度,数组元素的数量不应超过维度的大小。假如维度比提供的初始值数量大,则提供的初始值初始化靠前的元素,剩下的元素被初始化成默认值。注意:不允许一个数组初始化或复制给另一个数组。字符数组有一种额外的初始化形式,我们可以用字符串常量对此类数组进行初始化。使用这种方式时,要注意字符串字面值的结尾处还原创 2016-11-03 15:15:38 · 228 阅读 · 0 评论 -
(15)迭代器
迭代器类似于指针类型,提供了对对象的间接访问。就迭代器而言,其对象是容器中的元素或者string对象中的字符,迭代器可以从一个元素移动到另外一个元素。迭代器有有效和无效之分:有效的迭代器指向某个元素或者指向容器尾元素的下一位置,其他所有情况为无效。和指针不一样的是没获取迭代器不需要取地址符,有迭代器的类型同时拥有返回迭代器的成员。这些类型都有begin和end成员。begin负责返回指原创 2016-11-03 11:10:39 · 253 阅读 · 0 评论 -
(2)C++的第一步(HelloWorld)
读书期间每次都喜欢用这一句话来自嘲自己的学习成果和能力,那就是我精通各种语言版本的HelloWorld!不知道其他的朋友有没有和我相似的行为?那么今天我们从简单的HelloWorld程序来初窥C++的独特魅力吧!(如果还不知道怎么如何编写代码的朋友,可以去下载微软公司2013版本以上的Visual Studio,我用的是Microsoft Visual Studio 2015,而且上传代码之前原创 2016-10-21 16:16:18 · 473 阅读 · 0 评论 -
(23)成员访问运算符、条件运算符、逗号运算符
成员访问运算符有两种:一.点运算符:获取类对象的一个成员。如果成员所属的对象是左值,那么结果是左值;反之,如果成员所属的对象是右值,那么结果是右值。二.箭头运算符:作用于一个指针类型的运算对象,结果是一个左值。同时箭头运算符与点运算符有关,表达式ptr->mem等价于(*ptr)->mem:string s1="a string",*p=&s1;auto n = s1.siz原创 2016-11-07 17:32:11 · 998 阅读 · 0 评论