c++面向对象高级编程 学习一 不带指针的类

复数类 complex 是一个不带指针的类,其声明如下:

class complex
{
public:
complex(double r=0,double i=0):re(r),im(i){}
complex& operator +=(const complex&);
double real()const{return re;}
double imag()const{return im;}private:
double re,im;
friend complex& __doapl(complex *,const complex&);
}

对以上代码进行解释如下:

double re,im;

对类中的数据进行声明,即实部和虚部,类中的数据应该是private的,不能被其他类访问到,
在c++中访问类的私有成员变量主要通过:set/get接口,友元类,友元函数。

double real()const{return re;}
double imag()const{return im;}

函数若在类体内定义完成,则自动成为inline候选,在类体外,加inline关键字,则其可成为inline候选。当对程序进行编译时,若inline候选的程序比较简洁,编译器会将其按照inline进行处理,若inline候选的程序比较负责,则编译器不会将其按照inline处理。
上面的函数是常量成员函数,即,该函数不改变类中成员数据的内容,其中const的位置是在参数列表后,即在()后面,{}前面。在确定函数不改变数据内容的时候,一定要将函数写成常量成员函数的形式,即一定要加const。因为常量类只能调用常量成员函数,若函数不加const,则常量类调用该函数的时候就会出现错误,因为调用非常量成员函数,会改变类的成员数据,即与常量类自相矛盾。

complex(double r=0,double i=0):re(r),im(i){}
//re(r),im(i)是对参数进行初始化
complex(double r=0,double i=0){re=r;im=i;}
//对参数进行赋值

构造函数中要尽量使用值的初始化,而不是赋值,这样性能会更高。
构造函数也可放在类的private区域,此时使用构造函数创建类将是错误的,因为private不能被访问到,即不允许外界通过构造函数创建类,单例模式即是如此。

参数传递和返回值传递,尽量选择使用引用传递。因为值传递会将参数进行拷贝并传递,浪费空间,值传递不会改变原始数据。而引用传递,是参数的别名,不需要对数据进行拷贝,可提高程序的性能,引用传递会改变原始数据。
返回值传递,首先考虑引用传递,再考虑引用是否可行,若不可行,再选择值传递。返回值传递时,若传递的数据是函数中新定义的局部变量,此时要选择值传递,因为若选用引用传递的话,当这个类消失的时候,该函数以及其定义的局部变量均会消失,而当其局部变量作为引用传递的返回值依然存在时,则会出现问题。即,当一个函数进行操作后,将操作的结果在函数里新建了一个变量来保存这个结果时,这种情况就不能返回引用;当一个函数进行操作后,将操作的结果放在某个参数里进行返回的时候,可以返回引用。

操作符重载的一般格式如下:

函数类型 operator 运算符名称 (形参列表)
{
对运算符的重载处理
}
complex& operator +=(const complex&);

此处是对 += 进行操作符重载。此处参数是const complex&,其中const表示对该参数不进行修改,即可加const。此处还包含一个隐式参数,例如,c1+=c2,调用的即为c1.operator+=(c2),此处实现为:

inline complex&
__doapl(complex* ths, const complex& r)
{
ths->re += r.re;
ths->im += r.im;
return *ths;
}
inline complex&
complex::operator += (const complex& r)
{
return __doapl (this, r);
}

即,c1调用operator+=函数,c1作为隐式参数,和c2调用__doapl()函数,并将最后的操作结果作为引用传递传回c1。

当操作符重载不作为成员函数时,就没有隐式参数。例如:
此处返回值是值传递,是因为对数据进行操作后,将返回结果保存在一个新建的变量中进行返回的,因此用值传递。可根据参数的不同进行重载。

complex operator +(const complex& x,const complex& y);
complex operator +(const complex& x,double y);
complex operator +(double x,const complex& y);
complex operator +(const complex& x); //例如:正号的作用

对输出函数进行重载:
此处也是选择非成员函数的方式,因为此时直接调用cout<<c1即可进行输出函数。
如果选择成员函数的形式,则调用方式则变为:c1<<cout,与常用方式不同。
返回值是ostream&的原因是:调用cout<<c1<<c2时不会出错,另外,参数ostream& os不是const的原因是,代码对os进行了改变。

#include <iostream.h>
ostream& operator << (ostream& os,const complex& x)
{
return os << '(' << real (x) << ','<< imag (x) << ')';
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

codeforces 734A-C语言解题报告

734A题目网址 题目解析 1.输入n个结果,再输入每一个结果(A或D),统计A和D的数目,A>D,则输出Anton,A<D,输出Danik,AD,输出Friendship 代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> int main() { int n0,A0…

Linux进程之间通信 消息队列

使用命令 ipcs -q 查看对应的消息队列代码 文件接收者 #include <sys/types.h> #include <stdio.h> #include <unistd.h> #include <string> #include <signal.h> #include <wait.h> #include <sys/msg.h> #include <cstring&g…

c++面向对象高级编程 学习二 带指针的类

带指针的类&#xff0c;必须要自己写拷贝构造和赋值构造 拷贝构造&#xff1a;参数和类的类型一样的构造函数 赋值构造&#xff1a;重写操作符&#xff0c;且其参数和类的类型一样 class String { public: String(const char* cstr 0); String(const String& str); Strin…

英语口语 week11 Tuesday

英语文章 It was a cold and gloomy winter afternoon, people with their chilled hands tucked into their pockets or hidden in their sleeves. Fred was in a depressed mood, just like the weather,for he failed to get any award in the debate competition When he …

codeforces 271A-C语言解题报告

271A题目网址 题目解析 1.输入一个年份,求这个年份之后的每一个数字都各不相同的年份 举例: 输入: 2013 输出: 2014 2.求年份(四位数)的每一位数,再把这些数逐个比较 四位数求: 千位:n/1000 百位:n%1000/100 十位:n%100/10 个位:n%10/1; 代码 #include<stdio.h> #in…

进程之间通信 共享内存

命令 ipcs 命令查看共享内存、消息队列、管道等相关信息ipcs -m 查看共享内存的信息代码 创建共享内存共享内存 关联 进程分离共享内存删除共享内存 #include <sys/shm.h> #include <iostream>#define BUF_SIZE 1024int main() {int share_id 0;//创建共享内存i…

c++面向对象高级编程 学习三 堆、栈和内存泄漏

栈&#xff0c;是存在于某作用域的一块内存空间。在函数体内声明的任何变量&#xff0c;其所使用的内存空间均来自于栈。 堆&#xff0c;是指由操作系统提供的一块global内存空间&#xff0c;程序可动态分配获得若干内存空间块。 new操作符生成的对象所占用的内存空间即是从堆中…

clion编写C++ 使用多线程时候,CMakeLists.txt书写,引用-pthread

添加如下一行 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") 具体的例子 cmake_minimum_required(VERSION 3.17) project(mutex_learn)set(CMAKE_CXX_STANDARD 14)set(BOOST_ROOT "/usr/local/include/boost") #添加头文件搜索路径 include_direc…

codeforces 677A-C语言解题报告

677A题目网址 题目解析 1.输入n个数字,如果输入的数字比h大,就加2,如果小于等于h,就加1 举例: 输入: 3 7 4 5 14 输出: 4 代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> int main() { int n0,h0,count0;int nu…

c++面向对象高级编程 学习四 静态、类模板、函数模板

静态static&#xff1a;静态数据和静态函数&#xff0c;在内存中只有一份&#xff0c;不会随着创建对象的数目的增加而增加 static数据&#xff1a;比如银行的account类中&#xff0c;账户名是普通数据&#xff0c;100个对象会有100个账户名&#xff0c;但利率都是相同的&#…

线程的编程

完整代码 #include <sys/shm.h> #include <iostream> #include <unistd.h> #include <pthread.h>void * child1(void *arg){pthread_t tid pthread_self();printf("1 thread %lu \n",tid);}int main(int argc,char* argv[]) {int result{…

英语口语 week11 Friday

英语文章 I very much like simplicity in life. For me, college is far more than a place to improve my intellectual abilities Every weekend, I usually have a walk along the way to the front gate of Mount Qingcheng, enjoying the intense aromas of flowers on …

c++面向对象高级编程 学习五 组合、委托与继承

组合 composition 表示has a queue类中有一个deque容器&#xff0c;这种关系叫做 组合 queue中的六个函数都是调用c的函数完成的 template <class T> class queue { ... protected: deque<T> c; // 底層容器 public: // 以下完全利用 c 的操作函數完成 bool empt…

C++四种类型转换运算符:static_cast、dynamic_cast、const_cast和reinterpret_cast

参考链接 C四种类型转换运算符&#xff1a;static_cast、dynamic_cast、const_cast和reinterpret_cast

英语口语 week12 WednesDay

英语文章 Chengdu, a city with a long history, has always enjoyed the reputation as " The Land of Abundance" . It has been noted as one of the most livable cities in China, partly resulting from its favorable natural conditions and wealthy produc…

c++面向对象高级编程 学习六 虚函数

虚函数&#xff1a;在成员函数前面加上virtual&#xff0c;函数就变成了虚函数 继承函数&#xff1a;子类可以调用父类的函数&#xff0c;叫做继承了函数&#xff0c;即函数的调用权 三种函数&#xff1a; non-virtual 函数&#xff1a; 你不希望 derived class 重新定义 (ov…

C++ 数据结构 线性链表

#pragma once 减少头文件组合&#xff0c;降低编译出错的概率作用等效于 #ifndef FUNC_H #define FUNC_H代码主体#endif 线性表的定义 排队问题 简单的线性表 (物理 或者逻辑结构)1&#xff0c;数组2&#xff0c;链表线性表相关操作&#xff1a;1&#xff0c;线性表初始化2&a…

英语口语 week12 Thursday

英语文章 As the pace of life quickens with technological advancements, people are occupied by all kinds of trivial matters. They seem forever on the go. There’s no difficulty in imagining that the hustle and bustle of everyday life can make us lose focus…

H.264/AVC视频编解码技术详解 第一章 视频信息与压缩编码

H.264/AVC视频编解码技术详解系列笔记 是对 H.264/AVC视频编解码技术详解 课程的学习 文章目录人与世界的交互视频信号的表示方法视频压缩编码视频信息为什么可以被压缩&#xff1f;视频压缩编码的分类&#xff1a;视频压缩编码的基本技术人与世界的交互 从远古时代开始&#…

英语口语 week13 Monday

英语文章 Competitions between businesses can be very aggressive in contemporary society. However, the competition for talented personnel is thought to be the key to business competition. Wise employers consider their employees as the company’s core asset…