1. 在定义类的任何对象之前,必须首先给出这个类的声明。

  2. 类的私有成员具有类范围性质:类的私有成员仅能由类的成员函数访问。

  3. 两种定义是等价的。第一种方式中x默认地定义为私有成员

    class Z{

       int x;
       }

    和class Z{

       private:
       int x;

    }

  4. 关键字class和struct的区别
    两者都可以创建类,class:类成员在默认状态下是私有的;使用struct关键字,类成员在默认状态下是公有的。

  5. 类成员函数的定义

class Person
{
    public:
        void            setAge( unsigned n );//{age = n;}
        unsigned    getAge() const;//{return age;}
    private:
        unsigned age;
};
void Person::setAge( unsigned n )
{
    age = n;
}
unsigned Person::getAge() const
{ 
    return age;
}

两种不同定义的方式
如果定义在main函数里面,蓝色定义有问题:总是显示非法定义,拿出来作为全局变量和函数就没有问题。绿色的定义方式为内联函数。

6.通过在进行成员函数声明的时候使用inline关键字,可将原本定义在类声明之外的成员函数强 制变成内联函数。

7.一般情况下,应该采用引用方式进行对象的传递和返回,而不要采用传值的方式来进行。这是 因为通过传值方式来传递和返回对象时会降低效率并将面临对象的拷贝操作,从而是数据增大,浪费内存。
两者效率相同,但是引用方式的语法要简练的多。

8.不要以引用方式在函数中返回一个局部auto变量。因为函数返回的时候这个变量已经不在了。

9.通常,如果一个对象通过引用方式传到函数f中,而函数f又不会通过修改对象中的数据成员的值改变对象的状态,
那么最好将f的参数标记为const,可以预防对参数的误写,同时有些编译器还可以对这种情况进行优化。

10. 如果一个成员函数不需要直接或者间接地改变该函数所属对象的任何数据成员,那么最好将这个成员函数标记为const。
eg:int get() const{ return num;}-----只读函数
可以预防对该函数所属数据成员的误写。

11. 一个const成员函数只能调用其他const成员函数。调用非const成员函数可能会间接的改变对象的状态。

12. 构造函数不能有返回类型。构造函数参数的数量和类型不同。默认构造不带参数。构造函数最大的特点:函数名与类名相同,没有返回类型。

class Stack{
Stack(){initiative();}默认构造函数中调用了init成员函数。
}

13. 多数情况下,编译器为类生成一个共有的默认构造函数,只有下面两种情况例外:

• 一个类显式的声明了任何构造函数
• 一个类声明了一个非公有的默认构造参数(定义在private里)

14. 拷贝构造函数:创建一个新的对象,此对象是另外一个对象的拷贝品
如果类的设计者不提供拷贝构造函数,编译器会自动生成一个:将源对象所有数据成员的值逐一赋值给目标对象相应的数据成员。拷贝前后位于不同的地址空间,尽管他们有相同的成员变量值。

15. 如果拷贝构造函数是私有的,顶层函数和其他类的成员函数就不能通过传值来传递和返回该类的对象,因为这两个操作都需要调用拷贝构造函数。涉及到动态问题的时候默认拷贝函数会有问题。都是引用类型。

class abc
{
public:
    abc() {num = 10;}//default
    abc(const abc& def)
    {
        num = def.num;
    }
    void getnum()
    {
        cout << num<<'\n';
    }
private:
    int num;
};
int main()
{
    abc s1;
    abc s2(s1);//括号里的是原来的,括号外的是新的
    s2.getnum();
}

这部分还没怎么看懂。先留个链接。
http://blog.csdn.net/lwbeyond/article/details/6202256

16. 转型构造函数可以进行隐式类型转换

void f(Person p);
string s = "abc";
f(s);

如果Person中有这样的转型构造函数

Person(string s);

那么就可以通过。

explicit Person(const string& n){name = n;}

关闭这种转换。

17. 只能用初始化列表对const类型变量进行初始化
18. 析构函数:摧毁对象,出现情况:

+ 以某个类作为数据类型的变量超出其作用范围
+ 用delete操作符删除动态分配的对象

析构函数不带参数,所以不能被重载,这样每个类只能有一个析构函数。注意,没有返回值类型。
19. 文件打开模式 outfile.open(xxx, ios::app)

in    打开文件用于读取
out    打开文件用于写入
ate    打开文件并移到末尾
app    打开文件用于追加
trunc    若文件已存在,打开文件并截取流(清除原来的数据)
binary    以二进制流方式打开文件

20. 在类声明内部声明的static数据成员必须在任何程序块之外定义。而且,static成员不影响类的sizeof。

21. 如果将成员函数内的某个局部变量定义为静态变量,该类的所有对象在调用这个成员函数时,将共享这个变量。

22. 在成员函数内部可以用指针常量this来访问与成员函数的调用相关联的对象。this指针是一个常量,它不能作为赋值,递增,递减等运算的目标对象。this也只能在非static成员函数中才有效。

23. 如果要在类声明之外定义inline函数,关键字inline只能出现在该函数的声明中。

24. 在static成员函数内使用this是错误的


Tenacity
77 声望4 粉丝

有志者立长志,无志者常立志。


« 上一篇
初学C++
下一篇 »
初次接触安卓