首页 > 其他分享 >类模板、函数模板、其他

类模板、函数模板、其他

时间:2024-03-30 15:33:52浏览次数:18  
标签:__ const 函数 complex static 其他 return 模板

类模板、函数模板、其他

static

示例代码:

#ifndef __COMPLEX__
#define __COMPLEX__

class complex
{
   // 成员函数的隐藏参数有this -> 形参不能写.返回值当中可以写可以不写
   public:
  double real() const { return this->re; }
   private:
  double re, im;
};

#endif

实际创建过程当中,由于传入的对象不同,所以返回的real()内容不同

complex c1,c2,c3;
cout << c1.real();
cout << c2.real();

// 编译器实际执行
complex c1,c2,c3;
cout << complex::real(&c1);
cout << complex::real(&c2);

由于传入的指针对象不同.所以返回的real()值不同 -> real()函数只有一份.所以通过this这个指针区分需要处理哪个对象

static

在数据或者函数之前加了static以后会在内存当中单独有一块区域(只有一份) -> 静态数据如利率

static member functionsmember functions的区别在于,static函数没有this这个指针

静态函数如果要处理数据只能去处理静态数据

示例代码:

#pragma once

#ifndef __ACCOUNT__
#define __ACCOUNT__

class Account
{
public:
// 定义静态接口
static double m_rate;
static void set_rate(const double& x) { m_rate = x; }
};
// 定义 -> 分配内存
double Account::m_rate = 8.0;

#endif // !__ACCOUNT__

account-test.cpp:

#include <iostream>
#include "account.h"

int main()
{
Account::set_rate(5.0); // 通过class name调用static函数

Account a;
a.set_rate(7.0); // set是静态函数.所以&a不会变成this作为set_rate函数的形参
}

将构造函数放在private的位置:

class A
{
public:
static A& getInstance() { return a; };
private:
A();
A(const A& rhs);
static A a; // 这个写法当中无论如何都会创建A对象,无论外界是否使用
};

A& A::getInstance()
{
return a;
}

更新改进:

#pragma once

#ifndef __SINGLETON__
#define __SINGLETON__

class A
{
public:
static A& getInstance();
private:
A();
A(const A& rhs);
// static A a; // 如果A不使用则会浪费资源
};

A& A::getInstance()
{
static A a;
return a;
}

#endif // !__SINGLETON__

class template(类模板)

类模板示例:

#pragma once
#ifndef __TEMPCOMPLEX__
#define __TEMPCOMPLEX__

template<typename T> // 告诉编译器T未绑定 -> 这就成了类模板
class temp_complex
{
public:
temp_complex(T r = 0, T i = 0) : re(r), im(i) { };
temp_complex& operator+=(const temp_complex&);
T real() const { return re; }
T imag() const { return im; }
private:
T re, im;

friend temp_complex& __doapl(temp_complex*, temp_complex&);
};

#endif // !__TEMPCOMPLEX__

类模板在头文件声明类之前要写出

function template(函数模板)

示例代码:

#pragma once
#ifndef __STONE__
#define __STONE__

class stone
{
public:
// 一个构造函数和一个操作符重载 -> 无指针、不需要析构函数
stone(int w, int h, int we) : _w(w), _h(h), _weight(we) { }
// <操作符作用左数.传入右数 -> 带有this.this指左数
bool operator< (const stone& rhs) const { return _weight < rhs._weight; }
private:
// 石头的长、宽、重量
int _w, _h, _weight;
};

// 使用函数模板
template <class T>
inline
const T& min(const T& a, const T& b)
{
return b < a ? b : a;
}

#endif // !__STONE__

namespace(命名空间)

语法:

namespace std
{

}

所有的东西被包装在namespace当中 -> 可以理解一块独立区域

如何使用命名空间?

示例代码:(using directive):

#include <iosteam.h>
using namespace std;

int main()
{
cin << ...;
cout << ...;

return 0;
}

如果不使用命名空间:(using declaration)

#include <iosteam.h>
using std::cout;

int main()
{
std::cin << ...;
cout << ...;

return 0;
}
#include <iosteam.h>

int main()
{
std::cin << ...;
std::cout << ...;

return 0;
}

使用命名空间的情况下则不需要使用全名

标签:__,const,函数,complex,static,其他,return,模板
From: https://www.cnblogs.com/JunkingBoy/p/18105564

相关文章

  • Item6:如果你不想使用编译器生成函数,就明确拒绝
    芝士wa2024.3.30Item6链接对于一个自定义空类,编译器会自动提供四个构造函数:默认构造函数默认析构函数拷贝构造函数拷贝赋值运算符(=)如果我不想有这些构造函数,应该怎么办呢?书里给出了答案,自己声明这些函数,并设置为private,然后不去实现它,当有人不小心地调用了它们,在li......
  • sort函数对vector一维或者二维数组排序
    目录sort对一维数组排序1、sort对一位数组升序排序2、sort对一维数组降序排序sort对二维数组排序1、sort默认对横坐标进行升序排序,如下:2、使用自定义排序对纵坐标进行升序排序:额外知识:对横坐标进行降序排列,当横坐标相同时,对纵坐标进行升序排序sort对一维数组排序......
  • __cxa_pure_virtual报错(g++编译虚函数时)
    g++编译os的memory'时不知道为什么报错。尝试了很多方法(也可能搜错了)可以确定是纯虚函数出现了问题 复习一下虚函数的子类构造和析构的过程吧(一年过去了)允许派生类调用父类的同名函数而实现不同的功能,也叫动态联编。底层原理:虚函数表+虚函数表指针。每一个类都会对应一个......
  • C语言rand、srand库函数生成随机数(附时间戳)
    前言:当我们想要用C语言写程序来获取一个随机数时,该如何获取呢?这里我们上百度搜索一下这里就有提到使用rand、srand、time库函数搭配来获取随机数,也许根据其所说我们已经可以获得随机数解决问题,但想问题不能只浮于表面,下面我们来深入认识一下rand、srand、time库函数。一、ra......
  • [题解]P1439 【模板】最长公共子序列
    P1439【模板】最长公共子序列题意简述给出\(1,2,…,n\)的两个排列\(P_1\)和\(P_2\),求它们的最长公共子序列。范围限制:\(n\le10^5\)。样例53214512345输出:3。思路简述这道题看似是最长公共子序列,但是发现如果用\(O(n^2)\)的复杂度实现\(LCS\)就会时......
  • 函数调用约定——__cdecl与__stdcall
    1.定义函数调用约定,也称函数调用协议,是指在函数调用时,确定函数参数如何传递给被调用的函数,以及如何返回结果值给调用者的一系列规则。也就是函数的调用者与被调用者之间如何传参以及如何恢复栈平衡。2.职责规定了函数参数的压栈顺序,即有多个参数时,按照什么顺序进行压栈;规定了......
  • yii2 Gii使用和自定义模板
    yii2Gii使用和自定义模板配置开启giiconfig/web.php添加代码if(YII_ENV_DEV){$config['bootstrap'][]='gii';$config['modules']['gii']=['class'=>'yii\gii\Module',];}入口脚本web......
  • 软件项目管理(开发/实施/运维/安全/交付)全套文档模板
      前言:在软件项目管理中,每个阶段都有其特定的目标和活动,确保项目的顺利进行和最终的成功交付。以下是软件项目管理各个阶段的详细资料:软件项目全套文档资料下载:点我获取1.需求阶段目标:收集、分析和定义用户需求和业务目标。主要活动:需求调研:与用户沟通,了解他们的需求......
  • delphi ORM和泛型模板
    delphiORM和泛型模板实现CRUD1)定义数据模型(data-model)数据模型是ORM数据序列/还原所必需的。TTable<T:record>=record//1个表rows:TArray<T>;//表的行end;TTable2<T,T2:record>=record//2个表table1:TTable<T>;......
  • P4556 [Vani有约会] 雨天的尾巴 /【模板】线段树合并
    P4556[Vani有约会]雨天的尾巴/【模板】线段树合并在这题里面讲一下线段树合并。顾名思义就是把多个线段树合并成一个。显然完全二叉线段树(也就是普通线段树)是无法更高效的合并的,只能把所有节点加起来建个新树。但是在动态开点线段树中,有时候一个树只有几条链,这时候我们就是可......