六一的部落格


关关难过关关过,前路漫漫亦灿灿。



受访问说明符的限制


先声明后使用

在类中定义了类型成员之后, 才能使用类型成员

建议在类定义的开始处给出. 在友元关系之后

  1. 如果声明中使用,必须在声明之前定义
  2. 如果在定义中使用,类型成员在类定义中的位置不受限制
1class Account
2{
3private:
4    Money bal;                    // bal声明之前无Money的定义,错误
5    typedef double Money;
6};

正确

1class Account
2{
3private:
4    void test() { Money i = 5; }
5    typedef double Money;
6    Money bal;
7};

使用typedef或using定义

1class Screen
2{
3    public:
4        typedef string::size_type pos;
5
6    private:
7    pos cursor = 0;
8};
1class Screen
2{
3    public:
4        using pos = string::size_type;
5
6    private:
7    pos cursor = 0;
8};

类外部使用类型成员

 1class Screen
 2{
 3    public:
 4        using pos = string::size_type;
 5
 6    private:
 7    pos cursor = 0;
 8};
 9
10Screen::pos wd = 0;

类相关的非成员函数的声明

1class Screen()
2{
3    public:
4        typedef string::size_type pos;
5        void setHeight(pos);
6        pos height = 0;
7};
8
9Screen::pos verify(Screen::pos);

定义在类内的类型成员不能与类外的类型名相同

一般情况,内层作用域可以重新定义外层作用域中的名字,即使该名字已经在内层作用域中使用过

在类中,不能重新定义外层作用域的类型名

1typedef double Money;
2
3class Account
4{
5private:
6    typedef double Money; // 错误
7};

类的类型成员


受访问说明符的限制


先声明后使用

在类中定义了类型成员之后, 才能使用类型成员

建议在类定义的开始处给出. 在友元关系之后

  1. 如果声明中使用,必须在声明之前定义
  2. 如果在定义中使用,类型成员在类定义中的位置不受限制
1class Account
2{
3private:
4    Money bal;                    // bal声明之前无Money的定义,错误
5    typedef double Money;
6};

正确

1class Account
2{
3private:
4    void test() { Money i = 5; }
5    typedef double Money;
6    Money bal;
7};

使用typedef或using定义

1class Screen
2{
3    public:
4        typedef string::size_type pos;
5
6    private:
7    pos cursor = 0;
8};
1class Screen
2{
3    public:
4        using pos = string::size_type;
5
6    private:
7    pos cursor = 0;
8};

类外部使用类型成员

 1class Screen
 2{
 3    public:
 4        using pos = string::size_type;
 5
 6    private:
 7    pos cursor = 0;
 8};
 9
10Screen::pos wd = 0;

类相关的非成员函数的声明

1class Screen()
2{
3    public:
4        typedef string::size_type pos;
5        void setHeight(pos);
6        pos height = 0;
7};
8
9Screen::pos verify(Screen::pos);

定义在类内的类型成员不能与类外的类型名相同

一般情况,内层作用域可以重新定义外层作用域中的名字,即使该名字已经在内层作用域中使用过

在类中,不能重新定义外层作用域的类型名

1typedef double Money;
2
3class Account
4{
5private:
6    typedef double Money; // 错误
7};