C++特性名词解释
函数重载
如果同一作用域内的几个函数名字相同但是形参列表不同,我们称之为重载函数,使用的时候,编译器会根据使用的形参来确认到底该使用哪个函数。
类作用域和成员函数
类本身就是一个作用域,类的成员函数的定义嵌套在类的作用域之内。
类相关非成员函数
类的作者常常需要定义一些辅助函数,比如add,read,print等。尽管这些函数定义的操作从概念上来说属于类的接口组成部分,但实际上他们并不属于类本身。
构造函数,拷贝,赋值和析构
- 在C++中,对于一个空的类,编译器一般会默认它有4个成员函数:构造函数、析构函数、拷贝构造函数、拷贝赋值函数。
- 每个类都都定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫构造函数。在用类创建一个新的对象时,如果开发者没有定义构造函数,那么编译器将使用合成的默认构造函数来初始化这个对象
需要注意的是,某些类不能依赖于合成的默认构造函数,比如定义在块中的内置类型或复合类型(比如数组和指针)被默认初始化,那么它们的值将会是未定义的。
类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。 - 析构函数会在对象跳出程序(死亡)前被自动调用来释放内存,否则会造成内存泄露(Memory leak)。析构函数没有返回值,也不能带任何参数。
- 尽管编译器能替我们合成拷贝,赋值,和销毁的操作,但是对于某些类的合成版本却无法正常工作。特别是需要分配对象之外的资源时,合成的版本往往会失效。
public,private,protected
- 定义在public说明符之后的成员可以在整个程序内访问,public成员定义类的接口
- 定义在private说明符之后的成员可以被类的成员函数访问,但是不能被使用该类的代码访问,private部分封装了(即隐藏了)类的实现细节。
- 定义在protected说明符之后的成员可以被该类中的成员函数访问、子类中的成员函数访问、友元中的成员函数访问,但是不能被该类的对象访问
class Base {
public:
int publicMember;
protected:
int protectedMember;
private:
int privateMember;
};
- Everything that is aware of Base is also aware that Base contains publicMember.
- Only the children (and their children) are aware that Base contains protectedMember.
- No one but Base is aware of privateMember.
public、private和protected的继承也是如此。让我们考虑一个基类 和一个继承自基类的子类。
class A {
public:
int x;
protected:
int y;
private:
int z;
};
class B : public A{
// x is public
// y is protected
// z is not accessible from B
};
class C : protected A{
// x is protected
// y is protected
// z is not accessible from C
};
class D : private A // 'private' is default for classes
{
// x is private
// y is private
// z is not accessible from D
};
struct,class
- 使用这两个关键词定义类的唯一一点区别是,struct和class的默认访问权限不太一样,struct默认是public,而class默认是private。
友元(其实是类相关非成员函数升级版)
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。
封装的益处(即使用private的好处)
- 确保用户代码不会无意间破坏封装对象的状态
- 被封装的类的具体实现细节可以随时改变,而无需调整用户级别的代码。(牛b)
虚函数,纯虚函数实现多态。抽象类。
- 为了实现在父类子类中名字一样的函数,去执行不一样的作用,就需要使用虚函数,父类子类能够使用相同的函数处理不同的功能,体现了多态。实现虚函数的方法是在基类函数前面加上关键词virtual。
- 纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加"=0"
- 含有纯虚函数的类叫做抽象类(毕竟这个函数什么功能都没有实现,所以比较抽象)
内联函数
引入内联函数的目的是为了解决程序中函数调用的效率问题,这么说吧,程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代。这其实就是个空间代价换时间的i节省。所以内联函数一般都是1-5行的小函数。在使用内联函数时要留神:
- 1.在内联函数内不允许使用循环语句和开关语句;
- 2.内联函数的定义必须出现在内联函数第一次调用之前;
- 3.类结构中所在的类说明内部定义的函数是内联函数。
静态成员
我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化。
读书感。
这次看到了《C++primer》第七章结尾,我觉得这本书真的不必要完全看明白,因为它有太多的特性,但是这些特性都是人为构造的,也不是什么自然规律,完全记不住,我觉得linus说C++就是个垃圾是有道理的,因为他的观念是简洁而强大。然而C++完全与他的观念背道而驰,完全不简洁,强大但是也难以学会。我现在开始怀疑,网上那些好几个月看完C++primer的人是真的逐字逐句看完了吗?看完了这么多特性能记住多少?我觉得真正重要的从来都不是语法和语言特性,C++有太多的特性,然而这些特性都是需要花时间掌握的,而C语言就不一样的,极少的学习量,但是却能变化万千。但是开发的时候,又避免不了面向对象编程的这种思想,希望有一天C++能够被某个优秀的语言代替。或许是Rust吧。
posted on 2021-07-05 23:27 EasternCabbage 阅读(128) 评论(0) 编辑 收藏 举报