c++概览:抽象机制

  • 简化复数类
#include<iostream>
using namespace std;
class complex {
	double re, im;
public:
	complex(double r,double i):re{r},im{i}{}
	complex(double r):re{r},im{0}{}
	complex():re{0},im{0}{}

	double real()const { return re; }
	void real(double r) { re = r; }
	double imag()const { return im; }
	void imag(double i) { im = i; }

	complex& operator +=(complex z) { re += z.re; im += z.im; return *this; }
	complex& operator -=(complex z) { re -= z.re; im -= z.im; return *this; }
};
//操作符与类的定义分离开来
complex operator+(complex a, complex b) { return a += b; }
complex operator-(complex a, complex b) { return a -= b; }
complex operator-(complex a) { return { -a.real(),-a.imag() }; }
bool operator==(complex a, complex b) { return a.real() == b.real()&&a.imag() == b.imag(); }
bool operator!=(complex a, complex b) { return !(a == b); }
int main() {
	complex a{ 2.3 };
	complex b{ 1,2.2 };
	if (b != a)
		b += a;
	cout << b.real();
}
  • 抽象类,列表初始化,分离编译
main
#include "pch.h"
#include<iostream>
using namespace std;
int main() {
	Vector v0(1);//size构造函数
	Vector v1{ 1,2,3 };//初始化列表构造函数
	Vector v2{ v1 };//拷贝构造函数
	Vector v3(3);
	v3 = v2;//拷贝赋值运算符
	Vector v4{ move(v3) };//移动构造函数
}

pch.h
#include<initializer_list>
#include<list>
class Vector {
private:
	double * elem;
	int sz;
public:
	Vector(int s);
	Vector(std::initializer_list<double>lst);
	Vector(const Vector& a);
	Vector & operator = (const Vector& a);
	Vector(Vector&& a);
	double & operator [](int i);
	int size()const;
	~Vector();
};

pch.cpp
#include "pch.h"
#include<initializer_list>
#include<algorithm>
#include<iostream>
//构造函数
Vector::Vector(int s) :elem{ new double[s] }, sz{ s }{
	std::cout << "constructor1\n";
	for (int i = 0; i < s; i++) elem[i] = 0;
}
//构造函数
Vector::Vector(std::initializer_list<double>lst) : elem{ new double[lst.size()] }, sz{ int(lst.size()) }{
	std::cout << "constructor2\n";
	std::copy(lst.begin(), lst.end(), elem);
}

//拷贝构造函数与拷贝赋值运算符
Vector::Vector(const Vector& a) : elem{ new double[a.sz] }, sz{ a.sz }{
	std::cout << "constructor3\n";
	for (int i = 0; i < a.sz; i++) elem[i] = a.elem[i];
}
Vector & Vector::operator=(const Vector& a) {
	std::cout << "constructor4\n";
	delete[] elem;
	elem = new double[a.sz];
	for (int i = 0; i < a.sz; i++) elem[i] = a.elem[i];
	sz = a.sz;
	return *this;
}

//移动构造函数
Vector::Vector(Vector&& a) :elem{ a.elem }, sz{ a.sz }{
	std::cout << "constructor5\n";
	a.elem = nullptr;
	a.sz = 0;
}
//成员函数
double & Vector::operator [](int i) { return elem[i]; }
int Vector::size()const { return sz; }

//析构函数
Vector::~Vector() { delete[] elem; std::cout << "destrcutor\n"; }
  • const在前与在后的区别
//const在后表示一个const成员函数,在函数内不允许修改函数的成员变量,不允许修改re和im
double real()const { return re; }
//const在前表示限定返回值,返回值不允许出现在等号的左边
const double real(){ return re; }
  • 自定义函数范围for循环,定义begin(),end()函数
#include<iostream>
using namespace std;
template<typename T>
class Vector{
private:
    T * data;
    int sz;
public:
    Vector(int size);
    ~Vector(){delete[] data;}
    T & operator[](int i)const;
    T * begin(){
        return &data[0];
    }
    T * end(){
        return &data[0]+sz;
    }
};
template<typename T>
Vector<T>::Vector(int size){
    if(size<0) cout<<"error\n";
    data = new T[size];
    sz = size;
}
template<typename T>
T & Vector<T>::operator[](int i)const{
    return data[i];
}
int main(){
    Vector<string>vs(17);
    vs[0] = "hello";
    for(auto & tmp : vs){
        cout<<tmp<<" ";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值