C++Primer 第七章
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++Primer 第七章相关的知识,希望对你有一定的参考价值。
//1.定义在类内部的函数是隐式内联的。 //2.默认情况下,this指针的类型是指向类类型非常量版本的常量指针。对于类的常量成员函数的声明方法是:将const放置于成员函数的参数列表后,用于修饰this指针,此时这个const是底层const。 //3.编译器处理类的时候,先编译成员的声明,然后才轮到成员函数体。所以成员函数可以随意使用类的其他成员而无须在意这些成员出现的顺序。 // 类的类型成员必须先定义后使用。类的类型成员也受访问说明符限制(public等)。使用sizeof时候,类的类型成员并不占空间。类的类型成员不能通过类的对象访问而应该使用类名加作用域运算符来访问。 // 一般来说,类的类型成员通常出现在类的开始处。在类中,如果使用了外层作用域的名字,而且此名字代表一种类型,那么类之后不能重新定义该名字(一些编译器(包括vs2010)可以通过这样的代码,但是最好别用这种方法)。 class CTest { public: typedef int int32; int32 value; }; int size = sizeof CTest; //size = 4; CTest::int32 value = 0; //使用类的类型成员 // 我们可以将类名作为类型名使用从而直接指向类类型。或者,我们也可以将类名跟在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 第七章的主要内容,如果未能解决你的问题,请参考以下文章