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 //只要你认为合理 你可以任 ...
随机推荐
- Poi读取Excle报错 java.util.zip.ZipException: invalid stored block lengths
一:Poi读取Excle报错 java.util.zip.ZipException: invalid stored block lengths 系统中需要导出excle签收单,excle模板是预设好 ...
- BeanFactory与ApplicationContext
本文总结自:https://www.cnblogs.com/xiaoxi/p/5846416.html 我们常说的Spring容器(即Spring Ioc 容器),是如何创建bean的? BeanFa ...
- 20145302张薇《Java程序设计》第九周学习总结
20145302 <Java程序设计>第九周学习总结 教材学习内容总结 第十六周 JDBC简介 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC目的:让Jav ...
- 【读书笔记】《深入浅出nodejs》第五章 内存控制
海量请求+长时间运行 -> 内存控制 -> 一切资源高效循环利用 1. V8的垃圾回收机制与内存限制 在Node中通过JavaScript使用内存时,只能使用部分内存(64位系统下约1.4 ...
- MySQL_ERROR 1231 (42000) at line XX in file 'file_name' Variable 'time_zone' can't be
类似的错误信息如下 ERROR 1231 (42000) at line 10370 in file: '/root/sql/ultrax_170322.dmp': Variable 'time_zo ...
- maven问题:如何启动maven项目
maven是项目构建工具,用于解决jar间的依赖,启动maven项目的命令:tomcat:run 步骤如下: 1.在pom.xml文件中配置插件,此处配置的是tomcat8 2.右击项目名,找到Run ...
- ElasticSearch集群故障案例分析: 警惕通配符查询
最近ElasticSearch集群出现了 https://elasticsearch.cn/article/171 文章中描述的情况,现在转载全文警示下自己. 许多有RDBMS/SQL背景的开发者,在 ...
- Mac OS build caffe2 Error:This file was generated by an older version of protoc which is
问题所在 我们可以发现这个错误跟protobuf的版本有关,因此我们可以执行script/diagnose_protobuf.py 我们可以看到,pip install protobuf 和 brew ...
- layer弹出层的关闭及父页面的刷新问题
当在主页面执行添加或修改时,用弹出层是比较好的选择,如何关闭弹出层并对父级页面进行操作呢 首先在父级页面中打开一个添加页面(弹出层) 在添加页面的表单提交函数中添加如下代码: function for ...
- mysql悲观锁以及乐观锁总结和实践
悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中, 将数据处于锁定状态.悲观锁的实现,往往 ...