Hello,今天连更是吧
1.介绍
我们在前几篇学过结构,可以把类看做结构的升级版
我们看一下具体区别:
所以(到底有什么区别呢)
e,来看要求:
当对象中的类型没有关联性并且是硬件型(实际)时,使用struct(结构),当对象中的类型有关联性并且是用户型(抽象)时,使用class(类)
(仅代表个人观点)
2.使用
class <类名> {
<成员>
};
我们可以定义一个坐标和方向:
class Vector {
int x;
int y;
int way;
};
可以用结构的方式用:
Vector v;
v.x = 1;
v.y = 232;
v.way = 90;
//...
cout << v.y;
//...
(v就叫对象,或者叫实例)
但是,会报错:
因为它是私有的!
2.1.作用域
刚才的报错是因为我们的x,y和way是私有(private)访问域,如果把它变成共有访问域:
class Vector {
public:
int x;
int y;
int way;
};
C++提供了三种:
- public
- private
- protected
最后一个暂不需要,第一个是公有,第二个是私有,看看表:
栗子是最香的:
class Vector {
private:
enum rainbow {black, white};
public:
int x, y, way;
};
x,y,way外部可以访问,rainbow外部不能访问,但是所有的东西在内部都是可以访问,明白了吧。
2.2.函数
class里可以定义函数的:
class number {
private:
int num;
public:
int get_num() {
return num;
}
void use_num(int a) {
num = a;
}
};
这个地方get_num()是可以访问num的,虽然我没有试过,但是!我以我的人格和所有的零花钱保证,它不会出错。
2.3.运算符重载(zǎi)
可以把符号重载成你想让它工作的方式。
以下的符号不能重载:
- sizeof
- .
- .*
- ::
- ?:
- typeid
- const_cast
- dynamic_cast
- reinterpret_cast
- static_cast
以下的运算符只能被类重载:
- =
- ()
- []
- ->
重载运算符:
<返回值类型> operator <操作符>(<形参列表>) {
<代码块>
}
我们可以给number类做一个加法,但是先把num变为公有:
class number {
public:
int num;
int get_num() {
return num;
}
void use_num(int a) {
num = a;
}
};
然后重载:
number & operator +(const number a, const number b) {
return a.num + b.num;
}
之所以用const,是因为这样可以导致(懂的都懂)的错误。
还可以把<<重载,可以直接
number n;
cout << n;
你说,<<会不会不让重,别担心,<<其实被重载过了好多遍,最开始是位操作符,现在又变成cout的了,这回该我们重载了:
void operator <<(ostream os) {
os << n.num;
}
(cout是一个对象,它的类叫ostream)
我连测都不测,就知道肯定不能运行。如果测试的话,必须这样:
number n;
n << cout;
就问你,一两次行,天天用它你能受得了吗?!
所以,调换以下顺序:
void operator <<(ostream os, number n) {
os << n.num;
}
也不行,谁知道我们运行的叫os还是叫啥玩意儿的,所以,引用!
void operator <<(ostream & os, number & n) {
os << n.num;
}
这回可以了,但是这样会报错:
number n;
n.num = 145;
cout << "I have " << n << "carrots.";
因为其实上边cout的会被转化成:
cout << "I have " << n << "carrots.";
//转换成
((cout.operator <<("I have ")).operator <<(n)).operator <<("carrots.");
拿一个简单的栗子说一说:
cout << "ab" << "c";
变成:
(cout.operator <<("ab")).operator <<("c");
前一个显示ab的返回一个ostream&对象,后面的c跟着这个对象在调用。
再看刚才那个,因为显示n那个<<是我们重载的,void,没返回值,所以后面那个"carrots."找不到对象,会报错。
所以,框一个返回值:
ostream & operator <<(ostream & os, number & n) {
os << n.num;
return os;
}
就可以了。
今天到这吧,拜~