//1.定义在类内部的函数是隐式内联的。

//2.默认情况下,this指针的类型是指向类类型非常量版本的常量指针。对于类的常量成员函数的声明方法是:将const放置于成员函数的参数列表后,用于修饰this指针。对于类A,其一般的this指针类型为:A *const this;其常量常量成员函数中的this指针类型为:const A* const this。

//3.编译器处理类的时候,先编译成员的声明,然后才轮到成员函数体。所以成员函数可以随意使用类的其他成员而无须在意这些成员出现的顺序。
// 类的类型成员必须先定义后使用。类的类型成员也受访问说明符限制(public等)。使用sizeof时候,类的类型成员并不占空间。类的类型成员不能通过类的对象访问而应该使用类名加作用域运算符来访问。
// 一般来说,类的类型成员通常出现在类的开始处。在类中,如果使用了外层作用域的名字,而且此名字代表一种类型,那么类之后不能重新定义该名字(一些编译器(包括vs2010)可以通过这样的代码,但是最好别用这种方法)。
class CTest
{
public:
typedef int int32;
int32 value;
};
int size = sizeof CTest; //size = 4;
CTest::int32 value = ; //使用类的类型成员
// 我们可以将类名作为类型名使用从而直接指向类类型。或者,我们也可以将类名跟在class或者struct后使用
class CTest Test0; //此方法继承于C
CTest Test1;
// 上述两条声明语句均是声明了2个CTest类的对象。 //4.当我们创建类的一个const对象时,直到构造函数完成初始化过程,对象才取得其常量属性。 //5.友元的声明仅仅指定了访问的权限,若想使用类的友元函数,最好在友元声明在再对此函数进行一次声明。许多编译器并未强制这一点。 //6.在类的数据成员的声明中加入mutable,可以使其具有可变性,即使在类的常量函数中,此数据成员也可以被改变。 //7.对于类,只进行声明而没进行定义,则此时这个类是不完全类型。对于不完全类型,可以定义指向这种类型的指针和引用,也可以声明(但不能定义)以不完全类型作为参数或者返回类型的函数。 //8.如果没有在构造函数的初始值列表中显示的初始化成员,则该成员将在执行构造函数前被默认初始化。随着构造函数体的执行,初始化就完成了。成员初始化中变量初始化的顺序和其出现在类中的顺序一致,和其出现在初始化列表中的位置无关。 //9.如果一个构造函数能用一个实参调用,则实际上定义了转换为此类类型的隐式转换机制(单向转换),把这种构造函数称为转换构造函数。注意点:编译器只能执行一步类型转换。
// 可以使用关键字explicit来关闭上述隐式转换机制。此关键字应作用于能执行隐式转换的构造函数,而不要作用于不能执行隐式转换的构造函数,并且只需要在类内使用,在类外定义时候无需使用。
// explicit [ex·plic·it || ɪk'splɪsɪt] adj. 详尽的; 明确的; 清楚的; 直率的
class CTest1
{
public:
CTest1(string temStr){str = temStr;}
CTest1(){}
private:
string str;
};
CTest1 Test_0 = string("szn"); //Test_0 = {str="szn" }
CTest1 Test_1 = "slz"; //Test_1 = {str="slz" }
//string str = Test_0; //error C2440: “初始化”: 无法从“CTest1”转换为“std::basic_string<_Elem,_Traits,_Ax>”
void Fun(CTest1){}
Fun(string("szn")); //执行类的转换构造函数
//Fun("szn"); //error C2664: “Fun”: 不能将参数 1 从“const char [4]”转换为“CTest1” 编译器只能执行一步类型转换。 //10.类的静态成员存在于任何对象之外。对象中不包含任何与静态数据有关的数据。类似的,静态成员函数也不与任何对象绑定在一起,不包含this指针。
// 虽然静态成员不属于类的对象,但是仍然可以通过类的对象、引用、指针来使用类的静态成员。类似的,成员函数不使用作用域运算符就能使用类的静态成员。
// 当在类的外部定义类的静态成员时候,不能使用关键字static,该关键字在声明类的静态变量的时候使用。
// 由于静态数据成员不属于任何一个类的对象,所以它们并不是在创建类的对象的时候被定义的。这就意味着不应该在类的构造函数中初始化类的静态成员数据。应该在类的外部定义和初始化类的每个静态数据成员。
// 对于常量静态数据成员,应该在声明此变量的同时进行初始化。对于静态引用类型,也应该在类的外部进行初始化。
// 静态数据成员可以是不完全类型。非静态数据成员不能充当类成员函数的默认实参,而静态数据成员却可以。 //11.构造函数不能用const或volatile修饰
// 使用class和struct的唯一区别就是:前者的默认访问权限是private,而后者的默认访问权限是public
// 很多使用动态内存的类可以使用vector或者string对象管理必要的存储空间,使用vector和string可以避免分配和释放内存带来的复杂性 //12.有一点需要注意:由于类的常量对象只能调用类的常量成员函数,这就导致一些类的成员函数需要定义成两个版本:一个是非常量成员函数版本(供非常量对象调用),一个是常量成员函数版本(供常量对象和非常量对象调用)
// 常量成员函数只能返回类的常量对象,非常量成员函数既可以返回类的常量对象,也可以返回类的非常量对象 //13.将CTest1类的成员函数声明为CMyTest类的友元函数的步骤:
// A.首先要定义CTest1类。原因是:在声明CTest1类时候要具体的用到其成员函数,所以此时此类必须是已经定义的而不是仅仅被声明的。
// B.由于被定义成CMyTest类的友元函数,那么此函数若是用到了CMyTest类的成员变量,那么此函数的定义必须放到CMyTest类的定义之后,这里的理由和第一点一样。

C++Primer 第七章的更多相关文章

  1. C primer plus 读书笔记第六章和第七章

    这两章的标题是C控制语句:循环以及C控制语句:分支和跳转.之所以一起讲,是因为这两章内容都是讲控制语句. 第六章的第一段示例代码 /* summing.c --对用户输入的整数求和 */ #inclu ...

  2. C++ Primer Plus学习:第七章

    C++入门第七章:函数-C++的编程模块 函数的基本知识 要使用C++函数,必须完成如下工作: 提供函数定义 提供函数原型 调用函数 库函数是已经定义和编译好的函数,可使用标准库头文件提供原型. 定义 ...

  3. 【C++】《C++ Primer 》第七章

    第七章 类 一.定义抽象数据类型 类背后的基本思想:数据抽象(data abstraction)和封装(encapsulation). 数据抽象是一种依赖于接口(interface)和实现(imple ...

  4. 精通Web Analytics 2.0 (9) 第七章:失败更快:爆发测试与实验的能量

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第七章:失败更快:爆发测试与实验的能量 欢迎来到实验和测试这个棒极了的世界! 如果Web拥有一个超越所有其他渠道的巨大优势,它就 ...

  5. 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...

  6. 《Entity Framework 6 Recipes》中文翻译系列 (41) ------ 第七章 使用对象服务之标识关系中使用依赖实体与异步查询保存

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-7  标识关系中使用依赖实体 问题 你想在标识关系中插入,更新和删除一个依赖实体 ...

  7. Java语言程序设计(基础篇) 第七章 一维数组

    第七章 一维数组 7.2 数组的基础知识 1.一旦数组被创建,它的大小是固定的.使用一个数组引用变量,通过下标来访问数组中的元素. 2.数组是用来存储数据的集合,但是,通常我们会发现把数组看作一个存储 ...

  8. objective-c第七章课后练习2

    题:改变第七章例子中print方法,增加bool参数,判断如果是YES则对分数进行约简 @interface Fraction : NSObject { //int num,den; } @prope ...

  9. 读《编写可维护的JavaScript》第七章总结

      第七章 事件处理 7.1 典型用法 作者首先给了个我们一个处理事件的方法.看起来也没啥俩样,不过后来给出的优化方法很值得学习: // 不好的写法 function handleClick(even ...

随机推荐

  1. Oracle 数据库安装

    下载 www.oracle.com ->Downloads -> Oracle Database 安装: 解压到同一文件夹下 仅安装数据库软件 单实例数据库安装 企业版 oracle基目录 ...

  2. Intel Visual Fortran Compiler 11调用lapack库实现并行多处理计算

    采用fortran进行数值计算的朋友们都应该听说过大名鼎鼎的lapack库,我就不多做介绍了,在此,我只是介绍一个编译好的lapack二进制包ACML(AMD Core Math Library),并 ...

  3. nginx搭建http和rtmp协议的流媒体服务器

    nginx搭建http和rtmp协议的流媒体服务器 时间:2013-09-23 23:52来源:佚名 作者:本站 举报 点击:232次 实验目的:让Nginx支持flv和mp4格式文件,同时支持Rtm ...

  4. [转]C++ string的trim, split方法

    很多其他语言的libary都会有去除string类的首尾空格的库函数,但是标准C++的库却不提供这个功能.但是C++string也提供很强大的功能,实现trim这种功能也不难.下面是几种方法: 1.使 ...

  5. osgi 命令

    安装命令 install reference:file:D:/workspace/workspace-osgi/MsgBoxCreateModule 根据 返回的 ID再运行start

  6. Apache Camel

    Apache Camel 1 import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; i ...

  7. Hue协作框架

    http://archive.cloudera.com/cdh5/cdh/5/hue-3.7.0-cdh5.3.6/manual.html 一:框架 1.支持的框架 ->job ->yar ...

  8. crossvcl.com - 用VCL开发MacOS软件

    还没正式发布.用力戳 http://crossvcl.com/ 消息来源:Delphi G+ Group.具体信息还没完全披露,但是可以肯定的是,不是通过FireMonkey,而是通过原生的MacOS ...

  9. 【Java 进阶篇】【第一课】String类

    引用 String类包含在java.lang包中.这个包会在Java启动的时候自动import,所以可以当做一个内置类(built-in class).我们不需要显式的使用import引入String ...

  10. GIT 在本地保存账户和密码

    原文链接:http://www.jianshu.com/p/908591004f3b 解决方法,在本地的工程文件夹的.git下打开config文件 添加: [credential] helper = ...