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 //只要你认为合理 你可以任 ...
随机推荐
- U盘在制作Ubuntu启动盘后Windows系统下显示空间不对的解决办法(Ubuntu系统下格式化U盘的方法)
用Ubuntu系统自带的启动盘制作工具后,将U盘拿到Windows系统下使用显示出的空间与U盘大小不同. 解决该问题的办法: 使用Linux终端: 第一步:sudo fdisk -l 这个命令主要是查 ...
- Ubuntu16.04 Docker 安装
前提条件 Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker. 通过 uname -r 命令查看你当前的内核版本 ...
- TCP/UDP 端口
端口说明 小于1024的端口通常运行一些网络服务 大于1024的端口用来与远程机器建立连接 TCP端口 = 回显 = 丢弃 = 在线用户 = 时间服务 = 网络状态 = 每日引用 = 消息发送 = 字 ...
- 手动加载B120i/B320i阵列卡驱动安装RHEL7.0
实验设备: Micro server Gen8(B120i) DL360e Gen8(B320i) 目录 一.前期准备... 1 二.加载阵列卡驱动... 11 三.手动分区... 21 四.安装设置 ...
- pxe无人值守自动安装
rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpmyum listyum upda ...
- springmvc.xml和applicationContext.xml配置的特点
1:springmvc.xml配置要点 一般它主要配置Controller的组件扫描器和视图解析器 下为:springmvc.xml文件 <?xml version="1.0" ...
- redis命令的使用
批量删除特定前缀的keys redis-cli KEYS "prefix:*" | xargs redis-cli DEL 返回list的长度 > LPUSH test &q ...
- go语言中strings包中的Trim函数的作用是什么
答:Trim函数原型如下: func Trim(s string, cutset string) string 去掉字符串s中首部以及尾部与字符串cutset中每个相匹配的字符,如: s=" ...
- jQuery的$.each()遍历checkbox
$("input[type='checkbox']").each(function(){ var value = $(this).val(); //获得值 $(this).attr ...
- 08_MySQL DQL_SQL99标准中的多表查询(内连接)
# sql99语法/*语法: select 查询列表 from 表1 别名 [连接类型] join 表2 别名 on 连接条件 [where 筛选条件] [group by 分组] [having 分 ...