技术在于交流、沟通,转载请注明出处并保持作品的完整性。

一.Static

二.模板类和模板函数

三.namespace


一.Static

静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“对象(实例)级别”的.

类级别的成员,先于该类任何对象的存在而存在,它被该类所有的对象共享.

Static 1.修饰变量,该变量时全局变量,其实静态变量不归属于类中,它的初始化甚至在这个类初始化之前初始化,且静态变量必须初始化,且只会被初始化一次

 class Account {
public:
static double m_rate; //这只是声明,它脱离于对象
static void set_rate(const double& x) { m_rate = x; }
};
double Account::m_rate = 8.0;//static变量初始化(定义)

上面我们可以看到,我声明一个静态变量m_rate,在类中仅仅是声明,第6行才是真正的初始化(其实叫做定义,[定义:写一行代码使他获得内存叫做定义])

即使你多次初始化m_rate也没有用,因为m_rate只会被初始化一次

Static 2.修饰成员函数,第4行 就是一个成员函数,他跟静态变量同样不归属与这个类,所以静态函数没有this指针,即静态函数不能调用非静态成员变量

那么现在现在我们会想一下非静态成员函数如

 class complex
{
public:
...
double real() const { return re; }
...
}

上面的real()函数调用的时候

complex c1,c2,c3;
cout << c1.real();//c1调用real(); c1就是this
cout << c2.real();

编译器会编译成这样

complex c1,c2,c3;
cout << complex::real(&c1);//将this(&c1)传递
cout << complex::real(&c2);

然后这样

double real () const { return this->re; }

红色的this是编译器自动填充的,静态成员函数没有this指针,所以不能作用于非静态成员变量

调用静态函数的两种方式

Account::set_rate(5.0); //对象调用
Account a;
a.set_rate(7.0);//class name 调用

二.模板类和模板函数

1.模板类,下面这个就是模板类,

template<typename T>
class complex
{
public:
complex (T r = , T i = )
: re (r), im (i)
{}
complex& operator += (const complex&);
real () const { return re; }
imag () const { return im; } private:
T re, im;
friend complex& __doapl (complex*, const complex&);
};

模板类会跟你你实际传进的参数来创建出相应的类

如果你这样调用的话

  complex<double> c1(2.5,1.5);
complex<int> c2(,);

他实际上出创造出两个类

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

这样做会造成代码膨胀,但是与其实用价值相比,这些代码膨胀可以忽略

2.函数模板

class stone
{
public:
stone(int w, int h, int we): _w(w), _h(h), _weight(we){} 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;

}

当我们调用时

 stone r1(,), r2(,), r3;
stone r1(,), r2(,), r3;
r3 = min(r1, r2); r3 = min(r1, r2);

当我们调用到第3行是,编译器会做参数引导 函数模板会被编译成

inline const T& min(const stone& a, const stone& b)
{
return b < a? b : a;//当调用到此处时 b<a 调用者是b 所以b相当于this指针 这样就会自动调用到 stone中的 operator < 函数中
}

三.namespace

using directive 就是将该命名空间内的所有的对象都开放出来,但是一定要谨慎使用, 尤其在头文件中一定不要声明全局的using namespace,如果你这样做了,所有包含该头文件的都会有这个using namespace

include <iostream.h>
using namespace std; //这样之后会开放std命名空间内的所有变量
int main()
{
cin << ...; cin << ...; //使用using namespace后可以省略std::
cout << ...; cout << ...;
}

using declaration 指定开放命名空间

include <iostream.h>
using std::cout;//指定开放命名空间,只开放std::cout
int main()
{
std::cin << ...; std::cin << ...;
cout << ...; cout << ...;
return ;
}

如有不正确的地方请指正

参照<<侯捷 C++面向对象高级编程>>

C++面向对象高级编程(四)基础篇的更多相关文章

  1. C++面向对象高级编程(三)基础篇

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 一.拷贝构造 二.拷贝赋值 三.重写操作符 四.生命周期 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主 ...

  2. C++面向对象高级编程(一)基础篇

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要: 知识点1 构造函数与析构函数 知识点2 参数与返回值 知识点3 const 知识点4 函数重载(要与重写区分开) 知识点5 友元 先以C ...

  3. C++面向对象高级编程(二)基础篇

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 知识点1.重载成员函数 知识点2 . return by value, return by reference 知识点3 重载非成员函数 ...

  4. C++面向对象高级编程(八)模板

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...

  5. C++面向对象高级编程(九)Reference与重载operator new和operator delete

    摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...

  6. C++面向对象高级编程(五)类与类之间的关系

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming   OOP面向对象编 ...

  7. 夯实Java基础系列1:Java面向对象三大特性(基础篇)

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 [https://github.com/h2pl/Java-Tutorial](https: ...

  8. C++面向对象高级编程(七)point-like classes和function-like classes

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 ...

  9. C++面向对象高级编程(六)转换函数与non-explicit one argument ctor

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任 ...

随机推荐

  1. 【Swift实现代码】iOS架构模式之MVP

    1.什么是MVP? MVP是模型(Model).视图(View).主持人(Presenter)的缩写,分别代表项目中3个不同的模块. 1.1 模型 (Model):负责处理数据的加载或存储 1.2 视 ...

  2. 【bzoj4976】宝石镶嵌(思维dp)

    题目传送门:bzoj4976 不得不说这是道脑洞dp,思路真的清奇. 我们可以发现,虽然n很大,但是k只有100,这里面似乎隐藏了什么玄机. 我们可以发现,设总共有$ tot $个二进制位在这n个数中 ...

  3. LeetCode——Find Minimum in Rotated Sorted Array II

    Question Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allo ...

  4. 初识numpy的多维数组对象ndarray

    PS:内容来源于<利用Python进行数据分析> 一.创建ndarray 1.array :将一个序列(嵌套序列)转换为一个数组(多维数组) In[2]: import numpy as ...

  5. Keepalived安装配置入门

    准备两台虚拟机,IP如下: A:192.168.1.11 B:192.168.1.12 A为Master,B为BackUp 1.安装 yum install keepalived -y 2.配置 A服 ...

  6. Typora 配置说明

    目录 Typora 配置说明 贴图功能 自定义快捷键 快捷键使用 Linux下安装typora Typora 配置说明 为了更好的使用markdown,解决markdown中不如Word的不便之处,对 ...

  7. codeforce 589B枚举

    2017-08-25 12:00:53 writer:pprp 很简单的枚举,但是我调试了很长时间,出现各种各样的问题 /* theme:cf 589B writer:pprp declare:枚举 ...

  8. Zookeeper Zkclient客户端

    Zkclient是对Zookeeper的原生API进行了包装,实现了超时重连.Watcher反复注册等功能,它可以实现递归创建,删除节点,但是zkClient不能递归给节点赋值. 主要的api如下: ...

  9. ThinkPHP的URL重写时遇到No input file specified的解决方法

    因为在Fastcgi模式下,php不支持rewrite的目标网址的PATH_INFO的解析 ThinkPHP运行在URL_MODEL=2时,会出现 No input file specified.的情 ...

  10. gitlab 去除代码保护