漫步云端

移动开发(Android、iPhone、Windows Mobile) | JAVA | C | C++ | .net | Objective C | 微软企业开发技术 | 嵌入式系统设计与开发
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

随笔分类 -  C++ Primer 笔记

摘要:一、按成员初始化(与构造函数和拷贝构造函数有关) 用一个类对象初始化另一个类对象,比如: Account oldAcct( "Anna Livia Plurabelle" ); Account newAcct( oldAcct ); 被称为缺省的按成员初始化(default memberwise initialization),缺省是因为它自动发生,无论我们是否提供显式构造函数,按成员是因为初始化... 阅读全文

posted @ 2011-04-09 10:25 charley_yang 阅读(1748) 评论(0) 推荐(0) 编辑

摘要:C++为类中提供类成员的初始化列表 类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员2.进入构造函数后在构造函数中执行一般计算 使用初始化列表有两个原因: 1.必须这样做: 如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有... 阅读全文

posted @ 2011-04-07 00:06 charley_yang 阅读(1240) 评论(0) 推荐(1) 编辑

摘要:类对象数组初始化 如有一个如下类: class EquipmentPiece {private:int IDNumber;public:EquipmentPiece(int IDNumber) : IDNumber(IDNumber) {};}; 以下列出几种初始化的方法: <一>、对象数组 int ID1, ID2, ID3;EquipmentPiece bestPieces[] = { Equ... 阅读全文

posted @ 2011-04-06 23:01 charley_yang 阅读(12481) 评论(0) 推荐(1) 编辑

摘要:设想在一个军事应用程序里,有一个表示敌人目标的类: class enemytarget {public:enemytarget() { ++numtargets; }enemytarget(const enemytarget&) { ++numtargets; }~enemytarget() { --numtargets; } static size_t numberoftargets(){ re... 阅读全文

posted @ 2011-04-05 23:53 charley_yang 阅读(706) 评论(0) 推荐(2) 编辑

摘要:一、虚构函数定义 析构函数是一个特殊的由用户定义的成员函数,当该类的对象离开了它的域或者delete表达式应用到一个该类的对象的指针上时,析构函数会自动被调用。 析构函数的名字是在类名前加上波浪线 ~ ,它不返回任何值也没有任何参数,因为它不能指定任何参数, 所以它也不能被重载。尽管我们可以为一个类定义多个构造函数,但是我们只能提供一个析构函数,它将被应用在类的所有对象上。下面是Account 类... 阅读全文

posted @ 2011-04-05 23:48 charley_yang 阅读(3691) 评论(0) 推荐(0) 编辑

摘要:1. 我们可以给构造函数的参数提供一个缺省的实参。 class Account { public: // 缺省构造函数 Account(); // 声明中的参数名不是必需的 Account( const char*, double=0.0 ); const char* name() { return _name; } // ... private: // ... }; 下面是两个合法的 Accou... 阅读全文

posted @ 2011-04-05 22:20 charley_yang 阅读(1571) 评论(0) 推荐(0) 编辑

摘要:一、嵌套类 在一个类的内部定义另一个类,我们称之为嵌套类(nested class),或者嵌套类型。之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。 虽然嵌套类在外围类内部定义,但它是一个独立的类,基本上与外围类不相关。它的成员不属于外围类,同样,外围类的成员也不属于该嵌套类。嵌套类的出现只是告诉外围类有一个... 阅读全文

posted @ 2011-04-05 16:24 charley_yang 阅读(4321) 评论(0) 推荐(0) 编辑

摘要:假定 Screen类定义了四个新成员函数——forward() back() up()和down() 它们分别向右、向左、向上和向下移动光标。首先,我们在类体中声明这些新的成员函数 : class Screen { public: inline Screen& forward(); inline Screen& back(); inline Screen& end(); inline Scree... 阅读全文

posted @ 2011-04-05 02:36 charley_yang 阅读(1259) 评论(1) 推荐(0) 编辑

摘要:静态类成员包括静态数据成员和静态函数成员两部分。 一、静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点: 1.静态数据成员的定义。 静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头... 阅读全文

posted @ 2011-04-05 01:44 charley_yang 阅读(1422) 评论(0) 推荐(1) 编辑

摘要:先要理解class的意思。class应该理解为一种类型,象int,char一样,是用户自定义的类型。(虽然比int char这样build-in类型复杂的多,但首先要理解它们一样是类型)。用这个类型可以来声明一个变量,比如int x, myclass my等等。这样就像变量x具有int类型一样,变量my具有myclass类型。理解了这个,就好解释this了,my里的this 就是指向my的指针。如... 阅读全文

posted @ 2011-04-05 00:34 charley_yang 阅读(915) 评论(0) 推荐(0) 编辑

摘要:一、volatile 用法 可以将成员函数声明为volatile, 如果一个类对象的值可能被修改的方式是编译器无法控制或检测的,例如:如果它是表示 I/O端口的数据结构,则把它声明为 volatile 与 const 类对象类似,对于一个 volatile类对象,只有 volatile成员函数、构造函数和析构函数可以被调用: class Screen { public: char poll() v... 阅读全文

posted @ 2011-04-04 21:57 charley_yang 阅读(1119) 评论(0) 推荐(0) 编辑

摘要:1. 除了静态 static 数据成员外,数据成员不能在类体中被显式地初始化。 例如 :class First { int memi = 0; // 错误 double memd = 0.0; // 错误 }; 类的数据成员通过类的构造函数进行初始化。 2. 我们可以声明一个类但是并不定义它. 例如:class Screen; // Screen 类的声明 这个声明向程序引入了一个名字 Scree... 阅读全文

posted @ 2011-04-04 21:31 charley_yang 阅读(1301) 评论(0) 推荐(0) 编辑

摘要:我们或许希望所定义的对象、函数、类类型或其他实体,它只在程序的一小段代码中可见,因为这样可以更进一步地缓解名字空间污染问题,因为我们知道该实体只被用在很有限的地方,所以可能不想再花费太多努力来保证这个实体有惟一的名字而不会与程序其他地方声明的名字冲突。当我们在一个函数或嵌套块中声明一个对象时,由该声明引入的名字只在声明它的块中可见,但是,如果程序员想让一个实体被多个函数使用,而又不想让该名字在整... 阅读全文

posted @ 2011-04-03 23:11 charley_yang 阅读(2402) 评论(0) 推荐(0) 编辑

摘要:在局部域中的变量声明引入了局部对象(local object),有三种局部对象: 自动对象(automatic object)、寄存器对象( register object)以及局部静态对象(local static object)。 区分这些对象的是对象所在存储区的属性和生命期。自动对象所在存储区从声明它的函数被调用时开始,一直到该函数结束为止;寄存器对象是一种自动对象,它支持对其值的快速存 取... 阅读全文

posted @ 2010-12-19 22:05 charley_yang 阅读(1166) 评论(0) 推荐(0) 编辑

摘要:C++支持三种形式的域,局部域( local scope), 名字空间域 (namespace scope) 以及类域 (class scope)。 1. 局部域是包含在函数定义或者函数块中的程序文本部分。 2. 名字空间域是不包含在函数声明、函数定义或者类定义内的程序文本部分。 程序的最外层的名字空间域被称作全局域 (global scope )或全局名字空间域 (global namespac... 阅读全文

posted @ 2010-12-19 21:30 charley_yang 阅读(1571) 评论(0) 推荐(0) 编辑

摘要:一、函数指针的数组 我们可以声明一个函数指针的数组 例如 int (*testCases[10])(); 将 testCases 声明为一个拥有10个元素的数组,每个元素都是一个指向函数的函数指针,该函数没有参数,返回类型为 int 像数组testCases 这样的声明非常难读,因为很难分析出函数类型与声明的哪部分相关,在这种情况下使用 typedef名字可以使声明更为易读,例如 : // ty... 阅读全文

posted @ 2010-12-17 00:14 charley_yang 阅读(618) 评论(0) 推荐(0) 编辑

摘要:假定我们被要求提供一个如下形式的排序函数 :sort( start, end, compare ); start 和 end是指向字符串数组中元素的指针,函数 sort()对于 start 和end之间的数组元素进行排序,compare 定义了比较数组中两个字符串的比较操作(提供一个比较的策略【比较函数 】)。 为简化 sort()的用法而又不限制它的灵活性,我们可能希望指定一个缺省的比较函数。 ... 阅读全文

posted @ 2010-12-16 23:15 charley_yang 阅读(3435) 评论(1) 推荐(0) 编辑

摘要:通常我们会把一系列的可能会被共有的小操作封装成一个函数供其他函数调用。比如min()函数封装了比较2个值大小的操作。 但是C++调用一个函数被直接计算一段代码慢很多。不但必须拷贝两个实参,保存机器的寄存器,程序还必须转向一个新位置。 inline 内联函数给出了一种解决方案。 若一个函数被指定为inline 函数,则它将在程序中每个调用点上被内联地展开,例如: int minVal2 = mi... 阅读全文

posted @ 2010-12-15 23:06 charley_yang 阅读(2162) 评论(0) 推荐(0) 编辑

摘要:一、缺省情况下,函数的返回值是按值传递的 这意味着得到控制权的函数将接收返回语句中指定的表达式的拷贝,例如: Matrix grow( Matrix* p ) { Matrix val; // ... return val; } grow()把存储在 val 中的值的拷贝返回到调用函数,但调用函数不能用任何方式修改val 。 二、该缺省行为可以被改变,一个函数可以被声明为返回一个指针或一... 阅读全文

posted @ 2010-12-15 22:36 charley_yang 阅读(3738) 评论(1) 推荐(0) 编辑

摘要:在 C++中,数组永远不会按值传递,它是传递第一个元素,准确地说是第 0个 的指针。 例如,如下声明 :void putValues( int[ 10 ] ); 被编译器视为 void putValues( int* ); 数组的长度与参数声明无关,因此,下列三个声明是等价的: // 三个等价的 putValues()声明 void putValues( int* ); void putValue... 阅读全文

posted @ 2010-12-14 23:09 charley_yang 阅读(6768) 评论(0) 推荐(0) 编辑