C++面向对象高级编程(四)基础篇
技术在于交流、沟通,转载请注明出处并保持作品的完整性。
一.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++面向对象高级编程(四)基础篇的更多相关文章
- C++面向对象高级编程(三)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 一.拷贝构造 二.拷贝赋值 三.重写操作符 四.生命周期 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主 ...
- C++面向对象高级编程(一)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要: 知识点1 构造函数与析构函数 知识点2 参数与返回值 知识点3 const 知识点4 函数重载(要与重写区分开) 知识点5 友元 先以C ...
- C++面向对象高级编程(二)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 知识点1.重载成员函数 知识点2 . return by value, return by reference 知识点3 重载非成员函数 ...
- C++面向对象高级编程(八)模板
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...
- C++面向对象高级编程(九)Reference与重载operator new和operator delete
摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...
- C++面向对象高级编程(五)类与类之间的关系
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming OOP面向对象编 ...
- 夯实Java基础系列1:Java面向对象三大特性(基础篇)
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 [https://github.com/h2pl/Java-Tutorial](https: ...
- C++面向对象高级编程(七)point-like classes和function-like classes
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 ...
- C++面向对象高级编程(六)转换函数与non-explicit one argument ctor
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任 ...
随机推荐
- mysql中sql语句中常见的group_concat()函数意思以及用法,oracle中与其一样的功能函数是wmsys.wm_concat()
1.group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果.比较抽象,难以理解. 通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一 ...
- STM32-串行SPI nor
源:FLASH 存储学习-串行SPI nor 1.1 SST25VF080B简介1.1.1 主要特性 关键点:容量.速度(时钟速度.读写速度).功耗. l 容量:8MBit: l 最高SPI时钟频率: ...
- Swoole学习(七)Swoole之异步TCP服务器的创建
环境:Centos6.4,PHP环境:PHP7 <?php //创建TCP服务器 /** * $host 是swoole需要监听的ip,如果要监听本地,不对外服务,那么就是127.0.0.1;如 ...
- WCF可靠性会话之服务分流
可靠性绘画答条件: (1)服务绑定支持可靠性绘画:特别是netTcpBinding.wsHttpBinding及wsDualHttpBinding. wsDualHtttpBinding可靠性绘画始终 ...
- js 判断是ie浏览器
if (!+[1,]) { //IE window.event.returnValue = false; } else { return false; }
- 如何用纯 CSS 创作一个单元素抛盒子的 loader
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/qKwXbx 可交互视频 ...
- Clonal hematopoiesis of indeterminate potential(意义不明的克隆性造血)-CHIP
意义不明的克隆性造血是指由一个造血干细胞或者其他早期的起始血细胞为了更好的适应环境而发展成一个带有一些基因变异的亚型. 这个亚型带有基因变异一般是非驱动性的,而且该亚型占血细胞的比率跟年龄有很大的相关 ...
- 广播机制的CS模型实现
广播机制的cs模型实现如下: 首先可以使用ifconfig命令查看自己所在网段的广播地址 server.c #include<stdio.h> #include<unistd.h&g ...
- 解读:CombineFileInputFormat类
MR-Job默认的输入格式FileInputFormat为每一个小文件生成一个切片.CombineFileInputFormat通过将多个“小文件”合并为一个"切片"(在形成切片的 ...
- ArchLinux基本系统到XFCE4桌面搭建
Keep It Simple, Stupid 这是ArchLinux的哲学,更是一种人生哲学 好久没用linux了,这段时间因为一点点"破坏性"需求重新拾起linux用了一把 ...