一、类成员
1.定义类型的成员必须先定义后使用,而且只会能在类内使用
class screen
{
public:
typedef string::size_type pos;
private:
pos a = 0;
pos b = 0;
string contents;
};
2.定义在类内部的成员函数是自动inline的,而类外部不是。我们可以显式地在前面加上inline作为声明的一部分
3.和非成员函数一样,成员函数也可以重载,使用方法和之前相同
4.类中成员函数是不可以改变类中数据成员的值的,当我们声明一个可变数据成员时,就可以通过成员函数来改变,即使是const成员函数。使用方法:在成员声明前加上mutable
struct date
{
void add() const
{
x++; //报错
}
int x = 520;
};
struct date
{
void add() const
{
x++;
}
mutable int x = 520;
};
5.返回*this的成员函数
struct date
{
inline date& add(int num)
{
x += num;
return *this;
}
int x = 520;
};
二、类类型
1.声明时可以在类名前加class或struct
struct date a;
2.类的声明:我们可以像函数一样把声明和定义分离开来。这种声明被称为前向声明。在它声明之后定义之前该类是个不完全类型。不完全类型只能在非常有限的情况下使用:可以定义指向这种类型的指针或引用,也可以作为一个已经声明(但没有定义)的函数的参数或返回类型。
int main()
{
struct date;
}
三、友元进阶
1.类之间的友元关系,指定date为node的友元,则友元类(date)的成员函数可以访问此类(node)包括非公有成员在内的所有成员
struct node
{
friend struct date;
private:
int y = 1314;
};
struct date
{
int cmb()
{
node a;
return x + a.y;
}
int x = 520;
};
2.友元关系不具有传递性,a的友元是b,b的友元是c,但a不能访问c
3.除了为整个类提供友元外,也可以单独为某个成员函数声明友元,流程如下:
定义a类,声明f函数->定义b类,声明友元->定义f函数(下面的程序有问题...)
struct date
{
int cmb();
int x = 520;
};
struct node
{
friend int date::cmb();
private:
int y = 1314;
};
int date::cmb()
{
node a;
return a.y;
}
4.函数重载和友元
5.友元声明不是一定要在定义之前,当一个名字第一次出现在一个友元声明中,我们隐式地假定该名字在当前作用域是可见的