c++ 零碎知识点
namespace 理解
namespace: 用来给类或者函数做区间定义, 从而使编译器能准确定位到适合的类或者函数。
继承
继承机制: 是面向对象程序设计使代码可以复用的最重要的手段。允许在保持原有的特性基础上进行扩展, 增加功能, 产生的类为派生类。
继承方式: public 继承, protected 继承, private 继承。
下图为继承基类成员访问方式的变化:
类成员/继承方式 | public 继承 | protected 继承 | private 继承 |
---|---|---|---|
基类的 public 成员 | 派生类的 public 成员 | 派生类的 protected 成员 | 派生类的 private 成员 |
基类的 protected 成员 | 派生类的 protected 成员 | 派生类的 protected 成员 | 派生类的 private 成员 |
基类的 private 成员 | 在派生类中不可见 | 在派生类中不可见 | 在派生类中不可见 |
派生类对象可以赋值给基类对象/基类的指针/基类的引用 —— 切片(切割)
基类对象不能赋值给派生类对象
基类的指针可以通过强制类型转换赋值给派生类指针
模板 Template
类模板(也称类属类或类生成类)
类模板定义:
A. 首先定义类, 其格式为:
template <class T>
class foo
{
...
}
在类定义体中, 如采用通用数据类型的成员, 函数参数的前面需加上 T。当中通用类型 T 能够作为普通成员变量的类型, 还能够作为 const 和 static 成员变量以及成员函数的参数和返回类型之用。如:
template<class T>
class Test {
private:
T n:
const T i;
static T cnt;
public:
Test():i(0) {}
Test(T k);
~Test() {}
void print();
T operator+(T x);
}
B. 在类定义体外成员函数时, 若此成员函数中有模板参数存在, 则除了须要和一般类的体外定义成员函数一样的定义外, 还需在函数体外进行模板声明。如:
template<class T>
void Test<T>::print() {
std::cout<<"n="<<n<<std::endl;
std::cout<<"i="<<i<<std::endl;
std::cout<<"cnt="<<cnt<<std::endl
}
template<class T>
Test<T>::Test(T k):i(k){n=k;cnt++;}
template<class T>
T Test<T>::operator+(T x){
return n + x;
}
函数模板
函数模板: 用来创建一个通用的函数。以支持多种不同的形象, 避免重载函数的函数体反复设计。最大特点是把函数使用的数据类型作为参数。
声明形式:
template<typename (或 class) T>
<返回类型><函数名>(参数表)
{
函数体
}
如:
template<typename (或 class) T>
T fuc(T x, T y)
{
T x;
//...
}
模板函数
模板函数的生成就是讲函数模板的类型形参实例化的过程。
如:
double fuc(double x, double y)
{
double x;
// ...
}
operator(重载符)
operator 和运算符一起使用, 表示一个运算符重载函数,在理解时可将 operator 和运算符(如 operator=)视为一个函数名。目的如下:
- 使重载后的运算符的使用方法与重载前一致
- 扩展运算符的功能只能通过函数的方式实现
(operator=): 赋值运算符重载函数
相关博客
c++中namespace的用法理解
c++中的继承
c++中Template的使用
c++:模板总结
c++的重载操作符(operator)介绍
c++中的赋值运算符重载函数(operator=)