
C++初学
文章平均质量分 53
迷失在人间的小羊
这个作者很懒,什么都没留下…
展开
-
嵌套类、联合Union和局部类
1、在另一个类内部定义一个类,这样的类是嵌套类。2、在其类外部定义的嵌套类成员,必须定义在定义外围类的同一作用域中,在其类外部定义的嵌套类的成员,不能定义在外围类内部,嵌套类的成员不是外围类的成员。3、嵌套类可以直接引用外围类的静态成员、类型名和枚举成员。4、联合(union)是一种特殊的类,一个union对象可以有多个数据成员,但在任何时刻,只有一个成员可以有原创 2014-12-11 10:01:03 · 603 阅读 · 0 评论 -
容器适配器
1、三种容器适配器:stack、queue和priority_queue。2、stack栈可以建立在vector、list或者deque容器之上,而queue适配器要求其关联的基础容器必须提供push_front运算,因此只能建立在list容器上,而不能建立在vector容器上。priority_queue适配器要求提供随机访问功能,因此可建立在vector或deque容器上,但不能建原创 2014-12-09 19:57:21 · 348 阅读 · 0 评论 -
容器
1、顺序容器:将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,包括vector、list和deque(双端队列”double-ended queue)。 容器适配器:根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型,包括stack、queue和priority_queue类型。2、顺序容器类型顺序容器vector原创 2014-12-09 19:51:52 · 345 阅读 · 0 评论 -
强制类型转换
1、强制类型转换:static_cast、dynamic_cast、const_cast和reinterpret_cast。2、dynamic_cast支持运行时识别指针或引用所指向的对象。 const_cast将转换掉表达式的const性质。 编译器隐式执行的任何类型转换都可以由static_cast显示完成。 reinterpret_c原创 2014-12-09 19:41:23 · 221 阅读 · 0 评论 -
C++内置类型
类型 含义 最小存储空间————————————————————————————————bool 布尔型 ——char 字符型 8位wchar_t原创 2014-12-09 16:56:05 · 325 阅读 · 0 评论 -
友元和static类成员
1、友元机制允许一个类将其非公有成员的访问权授予指定的函数或类,友元的声明以关键字friend开始,它只能出现在类定义的内部。如:class Screen{ //Window_Mgr must be defined before class Screen friend Window_Mgr& Window_Mgr::relocate(Window_Mgr::原创 2014-12-09 20:08:19 · 595 阅读 · 0 评论 -
函数声明
1、函数声明由函数返回类型、函数名和形参列表组成。形参列表必须包括形参类型,但是不必对形参命名。这三个元素被称为函数原型。2、如果有一个形参具有默认实参,那么,它后面所有的形参都必须有默认实参。如:string screenInit(string::size_type height = 24,string::size_type width = 80,char background原创 2014-12-09 19:45:13 · 1049 阅读 · 0 评论 -
C++变量
1、C++标准保留了一组标识符用于标准库,标识符不能包含两个连续的下划线,也不能以下划线开头后面紧跟一个大写字母。2、变量初始化:复制初始化和直接初始化。复制初始化语法用等号(=),直接初始化则是把初始化式放在括号内。如 int ival(1024);//直接初始化 int ival = 1024;//复制初始化3、声明和定义变量的定义:用于为变量分配存原创 2014-12-09 16:59:06 · 271 阅读 · 0 评论 -
再谈面向对象编程
1、向基类构造函数传递实参:派生类构造函数的初始化列表只能初始化派生类的成员,不能直接初始化继承成员,但派生类构造函数可以通过将基类包含在构造函数初始化列表中来间接初始化继承成员。如:class Bulk_item:public Item_base{ public: Bulk_Item(const std::string& book,double sal原创 2014-12-09 20:13:58 · 285 阅读 · 0 评论 -
重载操作符
1、重载操作符是具有特殊名称的函数:保留字operator后接需定义的操作符符号。2、重载操作符必须具有至少一个类类型或枚举类型的操作符。3、操作符的优先级、结合性或操作数目不能改变。重载操作符并不保证操作符的求值顺序,尤其是,不会保证内置逻辑AND、逻辑OR和逗号操作符的操作数求值。4、使用重载操作符的方式,与内置类型操作数上使用操作符的方式一样。假定item原创 2014-12-09 20:11:34 · 481 阅读 · 0 评论 -
关联容器
1、关联容器支持通过键来高校地查找和读取元素,两个基本的关联容器类型是map和set。map的元素以键-值对的形式组织:键用作元素在map中的索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效地支持关于某个键是否存在的查询。2、关联容器类型:map 关联数组:元素通过键来存储和读取set原创 2014-12-09 19:59:32 · 353 阅读 · 0 评论 -
文件的输入和输出
1、fstream类型定义了两个自己的新操作——open和close。2、文件流对象的使用1)ifstream infile(ifile.c_str()); ofstream outfile(ofile.c_str());ifile和ofile存储读写的文件名的string对象2)ifstream infile; ofstream outfile原创 2014-12-09 19:50:11 · 468 阅读 · 0 评论 -
数组指针和保存指针的数组
1、数组指针:指向多维数组。如:int ia[3][4]; int (*ip)[4] = ia; //ip points to an array of 4 ints ip = &ia[2]; // ia[2] is an array of 4 ints从内向外阅读ip,*ip是int[4]类型——即ip是一个指向含有4个元素的数组的指针。2原创 2014-12-09 19:38:37 · 1583 阅读 · 0 评论 -
转换与类类型
1、可以定义转换操作符,给定类类型的对象,该操作符将产生其他类型的对象。2、转换操作符是一种特殊的类成员函数,它定义将类类型值转变为其他类型值的转换。转换操作符在类定义体内声明,在保留字operator之后跟着转换的目标类型:operator type(); //type表示内置类型名、类类型名或由类型别名所定义的名字如:class SmallInt{ p原创 2014-12-09 20:12:19 · 247 阅读 · 0 评论 -
一个简单的C++程序
1、操作系统通过调用main函数来执行程序,main函数则执行组成自己的语句并返回一个值给操作系统。2、一个简单的main函数 int main() { return 0; }3、定义函数必须指定:返回类型、函数名、圆括号内的形参表(可能为空)和函数体。4、main函数的返回值必须为int型。原创 2014-12-09 16:51:35 · 304 阅读 · 0 评论 -
引用
1、引用就是对象的另一个名字,在实际程序中,引用主要用作函数的形式参数。引用是一种复合类型,通过在变量名前添加“&”符号来定义,复合类型是指向其他类型定义的类型。在引用的情况下,每一种引用类型都“关联到”某一其他类型。不能定义引用类型的引用,但可以定义任何其他类型的引用。引用必须用与该引用同类型的对象初始化,不可将引用绑定到另一个对象:int ival = 1024;int &re原创 2014-12-09 17:00:18 · 416 阅读 · 0 评论 -
多重继承
1、虚继承:虚继承是一种机制,类通过虚继承指出它希望共享其虚基类的状态,在虚继承下,对给定虚基类,无论该类在派生类层次中作为虚基类出现多少次,只继承一个共享的基类子对象。共享的基类子对象称为虚基类。如:class istream:public virtual ios{ ... }; class ostream:virtual public ios{ ... };原创 2014-12-10 21:03:21 · 232 阅读 · 0 评论 -
运行时类型识别
1、通过运行时类型识别(RTTI),程序能够使用基类的指针或引用来检索这些指针或引用所指对象的实际派生类型。1)typeid操作符,返回指针或引用所指对象的实际类型。2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用。2、dynamic_cast操作的形式如下:dynamic_cast(val)Type是转换的目标类型,而val是原创 2014-12-10 22:34:53 · 452 阅读 · 0 评论 -
try块和异常处理
1、C++的异常处理包括:throw 表达式,错误检测部分使用这种表达式来说明遇到了不可处理的错误。try 块,错误处理部分使用它来处理异常。由标准库定义的一组异常类,用来在throw和相应的catch之间传递有关的错误信息。2、try块try{ program-statements}catch(exception-specifier){ han原创 2014-12-09 19:43:26 · 529 阅读 · 0 评论 -
优化内存分配
1、C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象。new表达式自动运行合适的构造函数来初始化每个动态分配的类类型对象。2、在每种情况下(预先分配内存以保存用户级对象或者保留类的内部数据)都需要将内存分配与对象构造分离开。3、C++提供下面两种方法分配和释放未构造的原始内存:1)allocator类,它提供可感知类型的原创 2014-12-10 21:06:26 · 357 阅读 · 0 评论 -
命名空间
1、命名空间定义以关键字namespace开始,后接命名空间的名字。2、命名空间可以在全局作用域或其他作用域内部定义,但不能在函数或类内部定义。3、命名空间作用域不能以分号结束。4、using声明:如:using cplusplus_primer::Query;using声明之后,程序可以无须cplusplus_primer限定符而直接使用名字Query原创 2014-12-10 20:10:11 · 663 阅读 · 0 评论 -
vector类型
1、使用vector之前,必须包含相应的头文件。#include2、vector是一个类模板。vector不是一种数据类型,而指示一个类模板,可用来定义任意多种数据类型。3、vector类的几种构造函数:vector v1; //vector保存类型为T的对象。默认构造函数,v1为空vector v2(v1); //v2是v1的一个副本vector原创 2014-12-09 17:05:57 · 305 阅读 · 0 评论 -
再谈迭代器
1、C++语言还提供另外三种迭代器:1)插入迭代器:这类迭代器与容器绑定在一起,实现在容器中插入元素的功能。2)iostream迭代器:这类迭代器可与输入或输出流绑定在一起,用于迭代遍历所关联的IO流。3)反向迭代器:这类迭代器实现向后遍历,而不是向前遍历,所有容器类型都定义了自己的reverse_iterator类型,由rbegin和rend成员函数返回。2、iostre原创 2014-12-09 20:06:02 · 330 阅读 · 0 评论 -
IO标准库类型
1、iostreamistream从流中读取ostream写到流中去iostream对流进行读写;从istream和ostream派生而来2、fstreamifstream从文件中读取;由istream派生而来ofstream写到文件中去;由ostream派生而来fstream读写文件;由iostream派生而来3、sstreamistrings原创 2014-12-09 19:45:57 · 337 阅读 · 0 评论 -
语句
1、if语句 if(condition) statement1 else statement22、switch语句switch(表达式){ case A1: statement1 case A2: statement2原创 2014-12-09 19:42:32 · 206 阅读 · 0 评论 -
C风格字符串
1、使用C标准库函数,必须包含相应的C头文件#include2、操纵C风格字符串的标准库函数strlen(s) //返回s的长度,不包含字符串结束符nullstrcmp(s1,s2) //比较两个字符串s1和s2是否相同。若s1与s2相等,返回0;若s1大于s2,返回正数;若s1小于s2,则返回负数strcat(s1,s2) //将字符串s2连接到s1后,并原创 2014-12-09 19:36:12 · 216 阅读 · 0 评论 -
迭代器
1、迭代器是一种检查容器内元素并遍历元素的数据类型。2、所有标准类容器都定义了相应的迭代器类型,只有少量的容器支持下标操作。如vector: vector::iterator iter;每种容器都定义了一对命名为begin和end的函数,用于返回迭代器。如果容器中有元素的话,由begin返回的迭代器指向第一个元素:vector::iterator iter = ivec原创 2014-12-09 17:10:35 · 328 阅读 · 0 评论 -
string类型
1、使用string类型对象,必须包含相关头文件。#include2、string支持的几个构造函数:string s1;//默认构造函数,s1为空串string s2(s1);//将s2初始化为s1的副本string s3("value");//将s3初始化为一个字符串字面值副本string s4(n , 'c');//将s4初始化为字符'c'的n个副本原创 2014-12-09 17:04:39 · 346 阅读 · 0 评论 -
动态数组
1、每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区或堆。C语言程序使用一对标准库函数malloc和free在自由存储区中分配存储空间,而C++语言则使用new和delete表达式实现相同的功能。2、动态分配数组时,只需指定类型和数组长度,不必为数组对象命名,new表达式返回指向新分配数组的第一个元素的指针。如:int *pia =原创 2014-12-09 19:36:55 · 272 阅读 · 0 评论 -
指针
1、指针保存的是另一个对象的地址。 2、一个有效的指针必然是以下三种状态之一:保存一个特定对象的地址;指向某个对象后面的另一个对象;或者是0值。若指针保存0值,表明它不指向任何对象。3、把int型变量赋给指针是非法的,但允许把数值0或在编译时可获得0值的const量赋给指针。4、特殊指针类型void * ,它可以保存任何类型对象的地址。void * 表明该指针与一地原创 2014-12-09 19:32:02 · 420 阅读 · 0 评论 -
函数
1、函数不能返回另一个函数或者内置数组类型,但可以返回指向函数的指针,或指向数组元素的指针的指针。2、const形参:在调用参数时,如果该函数使用非引用的非const形参,则既可给该函数传递const实参,也可传递const的实参。在函数中,不可以改变实参的局部副本。尽管函数的形参是const,但是编译器却将fcn的定义视为其形参被声明为普通的int型:void fcn(con原创 2014-12-09 19:44:22 · 330 阅读 · 0 评论 -
bitset类型
1、标准库提供的bitset类简化了位集的处理。#include2、在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值:bitset bitvec;长度值必须定义为整型字面值常量或者已用常量值初始化的整型的const对象。3、bitset对象的初始化:bitset b; //b有n位,每位为0bitset b(u); /原创 2014-12-09 17:12:47 · 277 阅读 · 0 评论 -
using声明
1、使用using声明可以在不需要加前缀namespace_name::的情况下访问命名空间中的名字。using声明形式如下:using namespace::name;2、一个using声明一次只能作用于一个命名空间成员。原创 2014-12-09 17:03:33 · 333 阅读 · 0 评论 -
typedef和枚举、类类型
1、typedef可以用来定义类型的同义词。如: typedef double wages;2、定义枚举和初始化枚举成员如:enum Forms { shape = 1,sphere,cylinder,polygon };3、定义类类型如: class ClassName{ public: //public member原创 2014-12-09 17:01:29 · 349 阅读 · 0 评论 -
输入和输出
1、C++标准库提供了istream和ostream,分别表示输入流和输出流。2、标准库定义了4个IO对象:cin(处理输入)、cout(处理输出)、cerr(输出警告和错误信息)和clog(产生程序执行的一般信息)。3、在C++程序中,大部分出现空格符的地方可用换行符代替,这条规则的一个例外是字符串字面值的空格符不能用换行符替代,另一个例外是空格符不允许出现在预处理指示中原创 2014-12-09 16:54:48 · 315 阅读 · 0 评论 -
C++ 视频学习笔记
1、C++与C有什么不同?【解答】C++与C语言最大的不同在于解决问题时思维方式的不同,C++采用面向对象思维,而C语言则采用面向结构思维。面向结构思维的宗旨就是将一个大程序拆成一个个很小的结构,结构(或叫方法)就是实现一个或多个功能的代码块。面向结构思维就是要将一个大程序划分为若干个很小的结构,每个结构都完成一个或多个功能,所有结构集合起来就可以完成一个大功能。面向结构编程思维有原创 2014-12-21 20:49:34 · 305 阅读 · 0 评论 -
C++ primer习题笔记
1、解释下面每个函数模板的定义并指出是否有非法的,改正所发现的错误。(e)typedef char Ctype; template Ctype f5(Ctype a);【解答】(e)合法,定义了一个模板函数f5,该函数的返回类型与形参类型相同,均可绑定到任何类型(而不一定是char类型)。2、何时必须使用typename?【解答】如果要在函数模原创 2014-12-21 09:53:50 · 443 阅读 · 0 评论 -
C++ primer 习题笔记第13~15章
1、下面第二个初始化不能编译。可以从 vector 的定义得出什么推断?vector v1(42);vector v2 = 42;【解答】若能编译成功说明,这是个复制初始化,创建 v2 时,首先调用接受一个 int 型形参的 vector 构造函数,创建一个临时 vector 对象,然后再调用复制构造函数用这个临时对象来初始化 v2。现在不能编译,说明vector 没有定义复制构造原创 2014-12-19 11:25:33 · 568 阅读 · 0 评论 -
C++ primer 习题笔记第10~12章
1、 假定 v 是 vector 类型的对象,则调用accumulate( v.begin(), v.end(), 0 )是否有错?如果有的话,错在哪里?【解答】没有错,accumulate 函数必须满足第三个实参的类型与容器内的意思匹配,或者可以转化为第三个实参的类型。本题中 double 可以转化为 int 类型,但是会有较大误差。2、算法不改变它所操纵的容器的大小原创 2014-12-18 14:32:34 · 452 阅读 · 0 评论 -
C++ primer习题笔记第7~9章
1、下面的程序虽然是合法的,但可用性还不够好,指出并改正该程序的局限。bool test( string& s) { return s.empty();} 【解答】其局限在于:此处使用引用形参的唯一目的是避免复制实参,但没有将形参定义为const引用,从而导致不能使用字符串字面值调用该函数(因为非const引用形参只能与完全同类型的非const对象关联)。可更正为:bool原创 2014-12-16 10:09:52 · 375 阅读 · 0 评论