C++ 基础知识十
来源:互联网 发布:pl sql developer官网 编辑:程序博客网 时间:2024/05/29 11:46
一.友元函数和成员函数选择方法
1.当无法选择左操作数时,使用全局函数进行重载
2.=,[],(),->操作符只能通过成员函数进行重载
二.用友元函数和成员函数重载<< >> 运算符
cin 是istream和ostream 是C++预定义的类
cin 是 istream 的对象,cout 是 ostream 的对象
运算符 << 由ostream 重载为插入操作,用于输出基本类型数据
运算符 >> 由 istream 重载为提取操作,用于输入基本类型数据
用友员函数重载 << 和 >> ,输出和输入用户自定义的数据类型
#include <stdio.h>#include <iostream>using namespace std;class Text4_1{public:// 运算符重载friend ostream &operator<< (ostream &out,Text4_1 &obj); // << 重载friend istream &operator>> (istream &in,Text4_1 &obj); //>> 重载public:Text4_1(){m_a = 0;m_b = 0;}Text4_1 (int a,int b){m_a = a;m_b = b;}void print(){printf("%d + %di\n",m_a ,m_b);}private:int m_a;int m_b;};//用友员函数重载 << 和 >> ,输出和输入用户自定义的数据类型//<< 运算符重载ostream &operator<< (ostream &out,Text4_1 &obj){out << obj.m_a << "+" << obj.m_b << "i";return out;}// >> 运算符重载istream &operator>> (istream &in,Text4_1 &obj){in >> obj.m_a >> obj.m_b;return in;}int main(){int a = 10;cout << "a = " << a << endl;//cout <<endl;Text4_1 t1(10,20);t1.print();cout << "t1 = " << t1; //输出自定义类型cout << endl;char ch = '\0';cout << ch << endl;Text4_1 t2;//cin>>t2;//cout << t2 << endl;cin >> ch;cout<< ch << endl;return 0;}类成员函数无法实现<<操作符重载,因为拿不到cout 这个类的源码
注意事项:
第一个参数需要隐式转换时,使用友元函数重载运算
友元函数没有this指针,所需操作符必须在参数列表显式声明,容易实现类型的隐式转换
() = [] -> 不能用友元函数重载
三.赋值运算符 =
赋值运算符重载用于对象的数据的复制
operator= 必须重载为成员函数
类型 & 类型名 ::operator= (const 类名 &)
#include <iostream>#include <stdlib.h>using namespace std;// = () [] -> 不能用友元函数进行重载class Student{public:Student(){m_id = 0;m_name = NULL;}Student(int id,char *name){m_id = id;int len = strlen(name);m_name = new char[len+1];strcpy(m_name,name);}//拷贝构造 防止浅拷贝Student(Student &obj){m_id = obj.m_id;int len = strlen(obj.m_name);m_name = new char[len+1];strcpy(m_name,obj.m_name);}~Student(){if(m_name != NULL){delete[] m_name;m_name = NULL;}m_id = 0;}// = 重载Student operator=(const Student &obj){if(this == &obj) //赋值内容是否相同{return *this;}//1,释放旧空间if(m_name != NULL){delete []m_name;m_name = NULL;}//2,开辟新空间int len = strlen(obj.m_name);m_name = new char[len+1];//3,内容复制m_id = obj.m_id;strcpy(m_name ,obj.m_name);return *this;}void print(){cout << "id = " << m_id << "name = " << m_name << endl;}private:int m_id;char *m_name;};int main5_1(){Student t1(10,"hello");t1.print();//Student t2 = t1; = 初始化 ,拷贝构造// 如果没写自定义的 赋值运算符重载,编译器会有一个默认的赋值运算符重载函数// 默认赋值运算符做的是一些简单的拷贝,是浅拷贝Student t2;t2 = t1; //赋值操作t2.print();return 0;}
阅读全文
0 0
- C语言基础知识之(十):结构体
- C语言基础知识之(二十):指针高级运用
- Objective-C 基础知识之(十): OC中的排序方法
- android 基础知识 十
- Android 基础知识 二十
- MakeFile基础知识(十)
- C#基础知识之十
- Java基础知识陷阱(十)
- C++ 基础知识十
- C 基础知识
- C 基础知识
- C基础知识
- C 基础知识
- c基础知识
- c基础知识
- c基础知识
- [C]基础知识
- c基础知识
- java中的string定义的两种方法和区别
- volatile是如何实现可见性和有序性
- java 基本排序
- JAVA电商在线支付视频教程(电子金融与支付实训教程 ) ,一起来分享!
- 使用Toolbar + DrawerLayout快速实现高大上菜单侧滑
- C++ 基础知识十
- Java学习心得之对象转型
- UVA 1398
- Bmob 移动后端云服务器平台实现登录注册
- RNN与LSTM
- leetcode-561. Array Partition I
- 使用Android Studio时遇到的两个问题及解决方法
- LeetCode.238 Product of Array Except Self
- C++ 类的深拷贝与浅拷贝||深拷贝通过重载拷贝构造函数与重载赋值运算符实现