十、操作符重载

原创 2017年01月03日 01:24:12

一、使用c++标准库
c++标准库并不是c++语言的一部分
c++标准库是由c++语言编写而成的类库和函数的集合
c++标准库定义的类和对象都位于std的命名空间里
c++标准库的头文件都不带.h后缀
c++标准库涵盖了c库的功能
c库中

#include<cstdio>
using namespace std;
int main()
{
    printf("helloworld\n");
    printf("press any key to continu....");
    getchar();
    return 0;
}

c++标准库里的输入输出的类:
输出:cout(c++标准库里的显示器对象)
输入:cin(c++标准库里的键盘对象)

#include <iostream>//c++的输入输出标准库
using namespace std;
int main()
{
    cout<<"Hello World"<<endl;//endl作用是换行cout<<"Hello"<<endl<<" World"输出hello空一行在输出world
    int x;
    int y;
    cout<<"1st Parameter: ";
    cin>>x;//将键盘的输入右移到x中
    cout<<"2nd Parameter: ";
    cin>>y;//将键盘中的值也移到y中
    cout<<"Result: "<<x+y<<endl;//输出x+y的值
    return 0;
}

左移和右移在c语言中只能用于整数,并且语义是确定不变的
二、操作符重载
操作符重载为操作符提供不同的语义

#include <cstdlib>
#include <iostream>
using namespace std;
struct Complex
{
    int a;
    int b;
};
int main(int argc, char *argv[])
{
    Complex c1 = {1, 2};
    Complex c2 = {3, 4};
    Complex c3 = c1 + c2;//出现错误,结构体不能相加

    cout << "Press the enter key to continue ...";
    cin.get();
    return EXIT_SUCCESS;
}

解决方法1:利用引用来求

#include<iostream>
#include<cstdlib>
using namespace std;
struct complax
{
    int a;
    int b;
};
complax add(const complax& a1, const complax a2)
{
    complax ret;
    ret.a = a1.a + a2.a;
    ret.b = a1.b + a2.b;
    return ret;
}
int main()
{
    complax t1 = {1, 3};
    complax t2 = {2, 5};
    complax t3;
    t3 = add(t1, t2);
    cout<<t3.a<<endl;
    cout<<t3.b<<endl;
    cin.get();
    return EXIT_SUCCESS;
}

add函数虽然可以解决complex变量相加的问题,但是complex在现实世界中是确实存在的复数,
并且复数在数学中的地位和普通的实数相同,那为什么不能让加操作符也支持复数相加呢

c++操作符重载的本质:
c++中通过operator关键字可以利用函数扩展操作符
operator的本质是通过函数重载实现操作符重载
如将上面的:
Complex add(const Complex& c1, const Complex& c2)//用引用
改成
Complex operator+ (const Complex& c1, const Complex& c2)//用引用

Complex c3 = add(c1, c2);
改成
Complex c3 = c1+c2;

用operator关键字扩展的操作符可以用于类吗?
三、c++中的友元:
private声明使得类的成员不能被外界访问
但是通过friend关键字可以例外的开发权限

include

include

using namespace std;

class Complex
{
int a;
int b;
public:
Complex(int a = 0, int b = 0)
{
this->a = a;//记得普通成员函数有一个指向类的指针
this->b = b;
}

int getA()
{
    return a;
}

int getB()
{
    return b;
}

friend Complex operator+ (const Complex& c1, const Complex& c2);//好朋友之间就没有什么秘密了

};

Complex operator+ (const Complex& c1, const Complex& c2)
{
Complex ret;

ret.a = c1.a + c2.a;
ret.b = c1.b + c2.b;

return ret;

}

int main(int argc, char *argv[])
{
Complex c1(1, 2);
Complex c2(3, 4);
Complex c3 = c1 + c2;
//main表示complex的朋友,输出也会有问题
cout << “Press the enter key to continue …”;
cin.get();
return EXIT_SUCCESS;
}

解决方法:
重载的左移运算符:
ostream& operator<< (ostream& out, const Complex& c)//返回值按照c++库里的重载
{
out<

C++ STL 基础及应用(2) 模板与操作符重载

模板是 C++ 语言中重要的概念。它提供了一种通用的方法来开发重用的代码,即以创建参数化的 C++ 类型。 本章将阐述一些具体的 STL 模板思想,并简单介绍操作符重载与模板的联系。 文中将给出一个简...
  • Raito__
  • Raito__
  • 2016年05月22日 17:13
  • 2551

C++运算符重载(11) - 重载<<和>>操作符

运算符 “>”用于流输出。 在开始重载这些操作符之前,必须注意下面的事项: 1) cout是输出类的对象,而cin是输入类的对象 2) 这些操作符必须重载为全局函数。如果想要让它们可以访问私有成员,...
  • shltsh
  • shltsh
  • 2015年05月27日 00:11
  • 762

探索Scala(1)-- 运算符重载

Scala语言运算符重载完全是语法层面的小把戏,本文记录我对Scala语言运算符重载的一些理解...
  • SpiderDog
  • SpiderDog
  • 2014年10月14日 14:39
  • 3315

Kotlin操作符重载(十)

Kotin操作符重载
  • learningITwell
  • learningITwell
  • 2017年06月08日 20:16
  • 278

C++运算符重载(4) - 不能被重载的操作符

C++,中,下面的操作符是不能被重载的: . (成员访问或点操作符) ?: (三元操作符或条件操作符) :: (范围操作符) .* (指向成员的指针操作符) sizeof (取对象大小操作符) typ...
  • shltsh
  • shltsh
  • 2015年05月26日 09:39
  • 2115

Kotlin开发Android笔记9:Kotlin操作符重载

Kotin有一些固定数量象征性的操作符,开发中可以在任何类中使用它们。使用方法是: 创建一个方法,方法名为保留的操作符关键字,如此就可以让这个操作符的行为映射到这个方法。重载这些操作符可以增加代码可读...
  • true100
  • true100
  • 2016年08月11日 14:01
  • 1279

C++中的重载运算符、继承、封装、多态讲解(进阶篇)

上次我们说到C++语言中的面向对象基本概念,那就是什么是类什么是对象,他们之间的关系是什么,本篇博文我们来说说,C++语言中重要的几个机制。(面试也经常会被问到这些知识点) 一个类可以派生自多...
  • songkai320
  • songkai320
  • 2016年07月15日 10:16
  • 1074

所有C++操作符重载的例子

1.[ ]操作符重载 C++语言规定:“[ ]”只能作为类的成员函数进行重载。 “[ ]”是C++中的下标运算符,对于数组或指针来说,下表运算的语义是确定的,不能进行重载。因此,如果看到一个运算...
  • chijianxingfeng
  • chijianxingfeng
  • 2013年04月30日 13:04
  • 2381

New运算符的重载

首先我们要清楚,为什么我们要重载new,和delete了?这还不是指针造成的,确实指针是一件让人喜欢的东西,用起来如此让人喜欢,让人顺手。然而小程序我们完全可以避免内存泄露问题,大程序就不那么容易了,...
  • ghevinn
  • ghevinn
  • 2014年01月16日 15:32
  • 5807

C++ 重载操作符 operator

参数个数的限定     非成员函数:   单目运算符:参数表中只有一个参数;   双目运算符:参数表中只有两个参数       成员函数:   单目运算符:参数表中没有参数; ...
  • fenhong91
  • fenhong91
  • 2017年02月07日 09:55
  • 825
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:十、操作符重载
举报原因:
原因补充:

(最多只允许输入30个字)