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 //只要你认为合理 你可以任 ...
随机推荐
- 2 安装企业wiki:confluence
jira sudo /etc/init.d/jira start 启动 jiarsudo /etc/init.d/jira stop 停止 jiar 方法一:$ sudo /etc/init.d/co ...
- windows下Qt5.4.2 for android开发环境配置
安装包链接: http://yunpan.cn/cFs5tikVA83hK 访问密码 d029 本人所有的软件都安装在D:/Qt 1. 安装 Qt 5.4.2 不在讲述 2, 安装p ...
- 基于JWT的token身份认证方案
一.使用JSON Web Token的好处? 1.性能问题. JWT方式将用户状态分散到了客户端中,相比于session,可以明显减轻服务端的内存压力. Session方式存储用户id的最大弊病在于S ...
- 吉哥系列故事——完美队形I
/*hud4512 dp[i]表示当前以下标i结束的最长公共上升子序列. 我们让第一个序列为原序列,第二个序列为原系列的反向. 则,也就是说,第二个序列的顺序为原序列的下标[n-1,0],设为j 当j ...
- redis:Invalid input of type: 'bool' type. Convert to a byte,string or number first
分析:出现此错误的原因是redis版本过高导致的,因此降低redis版本即可 解决: pip install -U redis==2.10.6
- Spring Cloud OAuth2(二) 扩展登陆方式:账户密码登陆、 手机验证码登陆、 二维码扫码登陆
概要 基于上文讲解的spring cloud 授权服务的搭建,本文扩展了spring security 的登陆方式,增加手机验证码登陆.二维码登陆. 主要实现方式为使用自定义filter. Authe ...
- Mysql MariaDB安装
1.安装 本人使用的是CentOS 7 ,默认yum安装,但默认yum安装版本有点低,可根据需要选择升级,我这里选择先升级再安装. 更新yum //更新yum包 yum -y update 配置yum ...
- Android studio 2.3安装遇到的问题
我的安装系统环境:windows 10+jdk1.8.0_111 . 1.在安装Android studio 2.3之前,请安装最新的java jdk.Android studio的安装包里是不包含j ...
- Springboot-mongodb MongoRepository接口 save方法 详解
问题: 我们都知道 mongodb 有两种添加数据的方式 一种 就是 save 方法 另外一种 insert 方法 这里两个方法 唯一的区别就是 insert:当主键"_id&qu ...
- python之Memcached 安装及操作
一.Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的 ...