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


原创粉丝点击