这里主要讲的是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)