C++【侯捷】——— 类模板、函数模板

C++【侯捷】——— 类模板、函数模板


这里主要讲的是this指针,尤其时候多个类之间相互调用的时候一定要搞清楚this指针。
如果函数只有一份,对象有好多份,一个函数要处理多个成员变量,区分上就是靠this指针来。

static

加了static的成员不再单独属于一个对象,他是单独的保存在内存的某个地址,也就只有一份。所以在设计程序的时候要看这个东西是不是只需要一份。
static函数和一般的函数一样,在内存中只有一份。静态函数没有this指针,不能像一般成员一样去访问和存取一般的成员数据,他只能处理静态的对象,静态的成员。
如果class中有静态的数据,一定要在class之外进行初始化。

class Account {
public:
    static double m_rate;
    static void set_rate(const double& x) { m_rate = x; }
};
**double Account::m_rate = 8.0;**

int main() {
    Account::set_rate(5.0);
    Account a;
    a.set_rate(7.0);
}

调用static函

数有两种方式:
1、通过对象来调用
2、通过class name调用
一般函数通过对象来调用函数,对象的地址会作为this指针传进函数,static函数就不会这样操作。

Singleton设计模式

创建的class只希望产生一个对象,做法可以不限于一种。

class A {
public:
    **static** A& getInstance{ return a; };
    setup() { ... }
 **private**:
     A();
     A(const A& rhs);
     **static** A a;
     ....
};

1、class的对象是静态的,只有一个。
2、将对象放在private中,外界就无法进行创建。
3、解决外界怎么访问对象的问题:创建一个getInstance函数。
使用方法:A::getInstance().setup();
但是,如果外界都不需要用的化,也是创建了,就产生了浪费。解决方法:将对象创建不放在类中,放在getInstance函数中:

class A {
public:
    **static** A& getInstance{ return a; };
    setup() { ... }
 **private**:
     A();
     A(const A& rhs);
     ....
};
A& A::getInstance()
{
     **static** A a;
    return a;
}

这样如果没人用就不会创建,一旦有人用了,就只创建一份。A::getInstance().setup();

cout

为什么cout可以接收任何类型的东西,都能打印呢?因为他对<<操作符进行和很多重载

class _IO_ostream_withassign : public ostream {
...
};
extern _IO_ostream_withassign cout;

模板

模板会造成代码的膨胀,但是这种并不是缺点,是对重载的提高。
分成两种:class template 和 function template
类模板在使用的时候必须要指定type用<>。
函数模板不用显示的指定,编译器可以进行argument deduction.
标准库中七八十个函数模板,就叫做算法。
这样,使用模板就要求所操作的额对象能够具有对应的操作符特性,将责任就推给了具体的类的实现。

namespace

using directive: using namespace std;
using declaration: using std::cout;

其他

operator type() const;
在类中顶一个operator type函数,做一个转换函数
explicit complex( … ) : initialization list { }
在构造函数前面加explicit
pointer-like object
对象重载成像指针一样
function-like object
对象重载成像函数一样
Namespace
template specialization
模板的特化
Standard Library
标准库
variadic template(C++11)
move ctor(C++11)
Rvalue reference(C++11)
auto(C++11)
lambda(C++11)
range-base for loop(C++11)
unordered constainers(C++11)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值