C++从入门到放弃--14.类(入门)

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;
}

就可以了。

今天到这吧,拜~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值