C++

框架:

#include

class super
{
public:
    int member;
//构造器,前面不能加void
    super(int member);
    super(const super& another);
//析构器,前面不能加void,基类最好定义为虚方法
    virtual ~super();
//虚方法
    virtual void operation(void);
//重载运算符
    super operator+(super &anthor);
    friend std::ostream& operator<<(std::ostream& os,super another);
protected://这个类和它的子类
private:  //只有这个类
};

super::super(int member)
{
    this->member=member;
}

super::~super()
{

}

void super::operation(void)
{
    std::cout<<"A"<member=another.member;
}

int main()
{
//虚方法
    super *sub_pointer=new sub(0);
    sub_pointer->operation();
//重载运算符
    super A(1),B(2);
    std::cout<

构造函数:

class super
{
public:
    int member1,member2;
    super(int member1,int member2);
//隐式转换构造函数
    super(const int& member4):member1(member4)
    {

    }
//复制构造函数
    super(const super& other)
    {

    }
};
//初始化列表
super::super(int member1,int member3):
    member1(member1),member2(member3)
{

}
一般声明为public
因为创建对象一般是在外部进行的
若声明为protected或private
那就意味着在外部创建对象是错误的
只能由类内部实例化(不通常的做法)
一般来说:不应同时使用 构造函数的重载 和 带默认参数的构造函数(会产生歧义)
带默认参数的构造函数只能在类内部定义
explicit 前缀定义 构造函数防止 隐式转换,在类外部定义不能重复加explicit

继承中的访问控制:

public:继承会保留基类中成员(包括函数和变量等)的可见性不变
protected:继承会将基类中的public可见性的成员修改成为protected可见性
private:继承会将基类中的public和protected可见性的成员修改成为private可见性

不允许重载的符号:

.  //成员访问运算符
.* //成员指针访问运算符
:: //域运算符
sizeof
?: //条件运算符

成员指针与成员函数指针:

#include

class super
{
public:
    int member;
    super(int member)
    {
        this->member=member;
    }
//const限定改函数不能改变成员的值
    int operation(int member)const
    {
        return this->member;
    }
};

int main()
{
//成员指针
    int super::*pointer_member=&super::member;
//成员函数指针
    int (super::*pointer_operation)(int member)const=&super::operation;
    super A(2);
    super *p=&A;
    std::cout<*pointer_member<*pointer_operation)(3)<

const的限定:

class super1
{
public:
    int member1;
    super1(int member1):member1(member1){}
//可修改该常对象的值
    mutable int member2;
};
//常对象(2种定义)
//所有数据成员都不能被修改
//只能调用常函数,不能调用非常函数
//不能被非常函数访问,只能被常函数访问
//只能被 指向常对象的指针 指向
const super1 A(2);
super1 const B(2);

class super2
{
//常数据成员
//只能通过构造函数的初始化列表进行初始化
//常函数与非常函数都可以访问,但不能修改
public:
//const数据成员
//既可以被常函数访问也可以被非常函数访问
    const int a;
    int operation(void)const;
    const int operation(void);
};
//常函数
//可以访问常数据成员或非常数据成员
//不能改变数据成员的值
//不能调用非常函数
int super2::operation(void)const
{

}
//返回值为const
const int super2::operation(void)
{

}

super1 C(2);
//指向对象的常指针
//不能修改它的指向
//必须在定义的时候被初始化
super1* const p1=&C;

//指向常对象的指针
//不能通过它改变指向对象的值
//可以改变指向
const super1* p2;

//对象的常引用
const super1& D(2);

类中静态函数与变量:

#include
//无需对象即可调用
class super
{
public:
    static int cont;
    static int getcont(void)
    {
        return cont;
    }
};

int super::cont=2;

int main()
{
    std::cout<

多继承:

class super
{
public:
    int member;
    super(int member)
    {
        this->member=member;
    }
protected:
private:
};

class sub1:public super
{
public:
    int member1;
    sub1(int member,int member1):super(member)
    {
        this->member1=member1;
    }
};

class sub2:public super
{
public:
    int member2;
    sub2(int member,int member2):super(member)
    {
        this->member2=member2;
    }
};

class subsub:public sub1,public sub2
{
public:
    subsub(int member,int member1,int member2):
        sub1(member,member1),sub2(member,member2)
    {

    }
};

虚继承:

class super
{
public:
    int member;
    super(int member)
    {
        this->member=member;
    }
protected:
private:
};

class sub1:virtual public super
{
public:
    int member1;
    sub1(int member,int member1):super(member)
    {
        this->member1=member1;
    }
};

class sub2:virtual public super
{
public:
    int member2;
    sub2(int member,int member2):super(member)
    {
        this->member2=member2;
    }
};

class subsub:public sub1,public sub2
{
public:
    subsub(int member,int member1,int member2):
        sub1(member,member1),sub2(member,member2),super(member)
    {

    }
};

虚函数:

#include

//虚函数多态的条件:
//类之间的继承符合赋值兼容
//改写了同名虚函数
//根据赋值兼容规则使用指针或引用
//静态,内联,构造 函数不能是虚函数
class super
{
public:
    virtual int operation(void)
    {
        return 1;
    }
};

class sub:public super
{
public:
//不加virtual也是虚函数
    int operation(void)
    {
        return 2;
    }
};

void print(super *X,int(super::*Y)(void))
{
    std::cout<<(X->*Y)()<operation()<

重载运算符:

成员函数版:
class super
{
    int member1,member2;
public:
    super(int member1=0,int member2=0):
        member1(member1),member2(member2) {}
    super operator+(super &another);
//前置单目运算符重载:
    super operator++();
//后置单目运算符重载:
    super operator++(int);
    super& operator+=(super& another);
//重载<<和>>(只能用友元函数)
    friend std::ostream& operator<<(std::ostream& os,const super& other);
    friend std::istream& operator>>(std::istream& is,super& other);
//重载强制转换运算符(不需指明返回值类型,默认和转换类型相同)
    operator int();
    void print(void)
    {
        std::cout<>(std::istream& is,super& other)
{
    is>>other.member1>>other.member2;
    return is;
}

super::operator int()
{
    return member1+member2;
}

友元函数版:
class super
{
    int member1,member2;
public:
    super(int member1=0,int member2=0):
        member1(member1),member2(member2){}
    friend super operator+(const super& a,const super& b);
//前置单目运算符重载:
    friend super operator++(super& a);
//后置单目运算符重载:
    friend super operator++(super& a,int);
    void print(void)
    {
        std::cout<

模板:

//函数模板
template
void fun(T param)
{

}

//类模板(带默认形参)
template
class super
{
public:
    T member;
    super();
    ~super();
    void operation(T val);
};

template
super::super()
{

}

template
super::~super()
{

}

template
void super::operation(T val)
{

}
定义方式:
superA;
superB;
superC;

内联模板:

//函数模板
template
inline void fun(T param)
{

}

//类模板
template
class super
{
public:
    T member;
    super(){}
    ~super(){}
    void operation(T val)
    {

    }
};
模板的使用:
superX;

命名空间:

//不能用于 函数,结构体,类内部
namespace A
{
    int a;
}

namespace B
{
    int a,b;
    namespace C
    {
        int c,d;
        namespace very_long_name_namespace
        {
            int e,f;
        }
    }
}

//可以没有名字
namespace
{
    
}

//简化名字
namespace D=B::C::very_long_name_namespace;

//可以不连续
namespace A
{
    int b;
}

using std::cout;

using namespace std;

强制转换:

class super
{virtual void operation(void){}};

class sub:public super
{};

int main()
{
    super *A,D;
    sub B,*C;
//动态转换
//必须是指针类型的转换
    A=dynamic_cast(&B);
//子类转换为基类
//基类必须有虚函数
    C=dynamic_cast(&D);
//静态转换
    double fo0Old=2.33333333;
    int fold=static_cast(fo0Old);
    return 0;
}

迭代器:

std::容器类::iterator iter=容器对象.begin();

重载,覆盖,隐藏

重载:
相同的范围(在同一个类中)函数名字相同;
参数不同;
virtual关键字可有可无
覆盖:
不同的范围(分别位于派生类与基类);
函数名字相同
参数相同
基类函数必须有virtual关键字
隐藏:
如果派生类的函数与基类的函数同名,但是参数不同,不论有无virtual关键字,基类的函数将被隐藏
如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字,此时,基类的函数被隐藏

你可能感兴趣的:(C++)