命名空间
using namespace std 告诉编译器使用 std 命名空间。命名空间是 C++ 中一个相对新的概念。
命名空间std:新式头文件都放到了此空间了(旧的没有)
三个重要的符号
->
A->B A为指针,->是成员提取,A->B是提取A中的成员B
::
表示作用域,和所属关系。
::是运算符中等级最高的,它分为三种:
1)global scope(全局作用域符),用法(::name)
int a=3;
class A{ int a=4; cout<< ::a;}
2)class scope(类作用域符),用法(class::name)
“比如声明了一个类A,类A里声明了一个成员函数voidf(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成voidA::f(),表示这个f()函数是类A的成员函数
实际操作中,我们一般会在私有区域定义数据,在公有区域定义相关的函数,以便在类的外部也可以调用这些函数,否则需要将函数生命为public。
3)namespace scope(命名空间作用域符),用法(namespace::name)
class Test{
public:
Test();
static void print()
{
std::cout<<"Test"<<endl; //命名空间时使用::
}
private:
int a;
};
Test::Test() : a(1) //定义时使用::
{}
Test::get(); //使用静态成员函数时用::
:
继承符号
// 派生类
class Rectangle: public Shape, public PaintCost
// 基类
class Animal {
// eat() 函数
// sleep() 函数
};
//派生类
class Dog : public Animal {
// bark() 函数
};
一个派生类继承了所有的基类方法,但下列情况除外:基类的构造函数、析构函数和拷贝构造函数。基类的重载运算符。基类的友元函数。
友元friend
friend complex& __doapl (complex *, const complex&);
关键字virtual
支持多继承
虚拟继承格式
C++使用虚拟继承(Virtual+Inheritance),使得派生类如果继承基类多次,但只有一份基类的拷贝在派生类对象中。
class D{......};
class B: public D{......};
class A: public D{......};
class C: public B, public A{.....};
这个继承会使D创建两个对象,要解决上面问题就要用虚拟继承格式
格式:class 类名: virtual 继承方式 父类名
class D{......};
class B: virtual public D{......};
class A: virtual public D{......};
class C: public B, public A{.....};
关键字virtual主要主要是实现动态绑定
C++中, 虚函数可以为private(默认情况下,类的所有成员都是私有的。), 并且可以被子类覆盖(因为虚函数表的传递),但子类不能调用父类的private虚函数。虚函数的重载性和它声明的权限无关。
一个成员函数被定义为private属性,标志着其只能被当前类的其他成员函数(或友元函数)所访问。而virtual修饰符则强调父类的成员函数可以在子类中被重写,因为重写之时并没有与父类发生任何的调用关系,故而重写是被允许的。
编译器不检查虚函数的各类属性。被virtual修饰的成员函数,不论他们是private、protect或是public的,都会被统一的放置到虚函数表中。对父类进行派生时,子类会继承到拥有相同偏移地址的虚函数表(相同偏移地址指,各虚函数相对于VPTR指针的偏移),则子类就会被允许对这些虚函数进行重载。且重载时可以给重载函数定义新的属性,例如public,其只标志着该重载函数在该子类中的访问属性为public,和父类的private属性没有任何关系!
纯虚函数可以设计成私有的,不过这样不允许在本类之外的非友元函数中直接调用它,子类中只有覆盖这种纯虚函数的义务,却没有调用它的权利。
在c++中,重写(override)方法有一点别扭,因为必须使用关键子virtual。只有在超类中声明为virtual的方法才能被子类正确地重写。virtual关键字出现在方法声明的开头。
一旦将方法或析构函数标记为virtual,它们在所有子类中就一直是virtual,即使在子类中删除了virtual关键字也同样如此,并且可以被Sub的子类重写,因为在Super类中将其标记为virtual。
运算符重载
operator 是C++的一个关键字,它和运算符(如=)一起使用,表示一个运算符重载函数
java能重载运算符吗?不能
//编写的过程和重载函数一样
inline complex&
complex::operator += (const complex& r)
{
return __doapl (this, r);
}
接口
C++ 接口是使用抽象类来实现的,
如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用 “= 0” 来指定的,如下所示:
public:
// 纯虚函数
virtual double getVolume() = 0;
异常处理
C++的异常处理和java差不多
参考:
https://www.runoob.com/cplusplus/cpp-tutorial.html
https://wws.lanzous.com/ir59Rls554d