c++类&对象&继承&模版

C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。

类&对象

类:class
访问类型: public、private、protected
public: 公共成员在类外部可以访问。
private: 私有成员,在函数类外部不可访问。
protected: 受保护成员,但在派生类中可以访问。

继承

有public, protected, private三种继承方式,它们相应地改变了基类成员的访问属性。

  1. public 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:public, protected, private
  2. protected 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:protected, protected, private
  3. private 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:private, private, private

但无论哪种继承方式,上面两点都没有改变:

  1. private 成员只能被本类成员(类内)和友元访问,不能被派生类访问;
  2. protected 成员可以被派生类访问。`
    继承语句:
    class derived-class: access-specifier base-class

模版

模板分为函数模板和类模板两种。他们的作用都是减少编程时的重复定义。

函数模版

函数模版定义的基本语法如下:
template<class 形参名, class 形参名, ...> 返回类型 函数名(参数列表){函数体}
例如:

template<class T> T add(T a, T b)
{ return a+b; }

该函数模板定义两个数相加。

类模板

类模版定义的基本语法如下:
template<class 形参名, class 形参名,...> class 类名{...};
例如:

template<class T> class A
{ 
    public:
    T add(T a, T b);
    T sub(T a, T b);
};

模板外如果要定义类模板里的函数,可以用以下形式:
template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体}
例如:

template<class T> T A<T>::add(T a, T b)
{
    return a+b;
}

template<class T> T A<T>::sub(T a, T b)
{
    return a-b;
}

从类的定义开始,使用上面的规则,将代码进行整合,可以实现两个数相加和相减。整段代码如下:

#include <iostream>
using namespace std;

template<class T> class A 
{
    public:
    	T add(T a, T b);
	T sub(T a, T b);
};


template<class T> T A<T>::add(T a, T b)
{
    return a+b;
}

template<class T> T A<T>::sub(T a, T b)
{
    return a-b;
}

int main()
{
    A<int> a;
    cout<<a.add(1,2)<<endl;
    cout<<a.sub(3,2)<<endl;
    return 0;
}

在linux命令行运行:

$ g++ xxx.cpp
$ ./xxx,out

即可看到结果。

补充

  1. 可以将定义部分单独写着头文件里。
  2. 注意c++保留字。例如try。
  3. template有时会有template parameter,具体格式为:
    Stack<int,std::vector<int> > vStack; // integer stack that uses a vector
In lumine Tuo videbimus lumen
原文地址:https://www.cnblogs.com/litingyu/p/8192139.html