C++:
推荐书籍:
《Effective C++》
《C++ primer》
《STL源码剖析》
C:
Type(built-in,struct)
data
Function
数据和函数包在一起,数据有很多分,函数只有一份。以此创建对象。
class,struct
complex c1(2,1);
complex c2;
complex *pc = new complex(0,1)
string s1("hello ");
string s2("World ");
string *ps = new string;
如果一个类有指针成员,就必须有拷贝构造和拷贝复制函数
##栈,堆与内存管理:
scope:作用域
{}
Stack:是存在于某个作用域(scope)的一块内存空间(memory space)。例如当你调用函数,函数本身即会形成一个satck,用来放置它接收的参数,以及返回地址。在函数本身内声明的任何变量,起所使用的内存块都取自与stack。
stack object只要离开作用域,它的生命周期就终止了
Heap:或者说是system Heap,是由操作系统提供的一块全局(global)内存空间,程序可动态分配(dynamic allocated,就是用new),从中取得若干块(block)
内存泄露:拥有者本来有一块内存,经过某些事件或者某些作用域之后,拥有者对这块内存失去了控制,以至于拥有者没有办法还给操作系统。(内存是一个很重要的资源)
new:先分配一块memory,再调用构造函数ctor,new被分解为三个动作(Complex * pc = new Complex(1,2)):
array new 一定要搭配 array delete
delete:先调用析构函数dtor,再释放内存。
例如:delete ps;
内存溢出:
##动态分配所得的内存块(memory block),in VC
Complex* p = new Complex[3]
String* s = new String[3]
##!!注意一种情况,连串赋值的时候,返回类型不能为void!要返回对象(或者的引用)
return &this;//传出去的人,不必知道接受端用什么形式来接受。this所指的是一个东西,不管是东西还是引用,反正都传东西出去,具体传出去是什么,主要看返回类型。
##namespace 经验谈
namespace起着包装作用
namespace std
{
...
}
使用namespace方法:
##进一步了解static:
complex c1,c2,c3;
cout << c1.real();
cout << c2.real();
原来的形式为
complex c1,c2,c3;
cout << complex::real(&c1);
cout << complex::real(&c2);
此时,c1的地址成为指针。
Adapter(变压器,改造,适配)
例如:
virtual void draw() const = 0; //pure virtual,子类一定要定义
virtual void error(const std::string& msg);//impure virtual
int objectID const; //non-virtual,不需要子类重新定义它
标准库 大于 STL
标准库以header files形式出现。
注意:容器里面的东西一定要一样的大小!
##关于转换函数,没有返回对象。
//转换函数-->没有返回类型
class Fraction
{
public:
Fraction(int num, int den = 1):m_numerator(num),m_denominatir(den){}
// operator double() const
// {
// return double(m_numerator / m_denominatir);
// }
Fraction operator+ (const Fraction& f)
{
return Fraction(...);
}
private:
int m_numerator;
int m_denominatir;
};
Fraction f(3,5);
Fraction d = f + 4;//调用 non-explicit ctor 将4 转换为Fraction,然后调用operator +
//转换函数-->没有返回类型
class Fraction
{
public:
explicit Fraction(int num, int den = 1):m_numerator(num),m_denominatir(den){}
// operator double() const
// {
// return double(m_numerator / m_denominatir);
// }
Fraction operator+ (const Fraction& f)
{
return Fraction(...);
}
private:
int m_numerator;
int m_denominatir;
};
Fraction f(3,5);
Fraction d = f + 4;//调用 non-explicit ctor 将4 转换为Fraction,饭后调用operator +
template
class shared_ptr
{
public:
T& operator*() const
{
return *px;
}
T*operator->() const
{
return px;
}
shared_ptr(T* p):px(p){}
private:
T* px;
long * pn;
};
##function-like class 所谓仿函数,也叫函数对象,操作符重载,小括号 (一个class设计出来像一个function)
C++标准库中,仿函数所使用的奇特的base classes.
##Variadic Templates,用递归继承,tuple
##class template类模板,fanction template 模板函数,number template 成员模板
类模板:
template
class A
{
public:
A(T r = 0, T i = 0):re(r),im(i){}
private:
T re,im;
}
函数模板:
template
inline
const T& min(const T& a, const T& b)
{
return b < a ? b: a;
}
函数模板不必指明它的type,因为函数模板一定是去调用,调用的时候会输入参数。
例子:
//泛化
template < class Key >
struct hash {};
//特化
template<>
struct hash
{
size_t operator()(char x) const {return x;}
};
template<>
struct hash
{
size_t operator()(char x) const {return x;}
};
template<>
struct hash
{
size_t operator()(char x) const {return x;}
};