手把手写C++服务器(7)——给C语言程序员看的C++科普

前言:这一篇博客只能算是服务器编程专题的番外篇,在去年的时候,我打算写一个专题,名字就叫做给C语言程序员看的C++科普,这可以后来遇到很多事情耽搁了(全是借口),写了一半的专题也没了恒心再写下去(太懒了难成大器),但是放弃又难(冠冕堂皇),所以才有了这个番外篇。这是去年的草稿:

目录

1、类与对象概念

2、struct和class

3、 设计class时将public放在前面

4、 接口与实现分离:一般设计架构

5、尽可能使用const代替#define

6、const的作用

7、static的作用

8、this指针

9、inline内联函数

10、extern "C"

11、C语言实现C++类

12、::范围解析运算符

13、右值引用

14、多态

15、智能指针

写在最后

参考:


1、类与对象概念

  • 类是创建对象的模板,一个类可以创建多个相同的对象;对象是类的实例,是按照类的规则创建的。
  • 对象是类的一个变量,类是对象的模板。
  • 类是抽象的,不占用存储空间;对象是具体的,占用存储空间。

2、struct和class

  • struct中的成员默认的访问权限是public,class中成员的默认访问权限是private。
  • 在C语言中,struct不能定义成员函数;在C++当中,struct能够定义成员函数。

3、 设计class时将public放在前面

public的受保护程度最低,是最需要其他class使用者关注的部分,所以将public放在最前面。

接着是protected,最后是private。

class Demo{
public:
    ……
protected:
    ……
private:
    ……
};

4、 接口与实现分离:一般设计架构

将类的声明放在指定的头文件中,将类的成员函数定义放在另一个文件中,实现隐蔽信息的效果。

比如要实现一个Student类,文件结构如下:

student.h

#include 
using namespace std;

class Student{
public:
    void display();
private:
    int num;
    int name;
};

student.cpp

#include "student.h"
#include 

using namespace std;

void Student::display() {
    cout << "num: "<< num << endl;
    cout << "name: " << name <

main.cpp

#include 
#include "student.h"
using namespace std;

int main () {

    Student student;
    student.display();

    return 0;
}

5、尽可能使用const代替#define

#define用了实现宏(macros),看起来像函数,不会带来函数调用开销;#define不被视为语言的一部分,对于编译器不会带来额外的开销,但是如果出现了任何错误,都不会被检查出!使用const代替,将预处理器承担的风险转接给编译器,是一种合理的做法。

6、const的作用

  1. 修饰变量,说明该变量不可以被改变;

  2. 修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer);

  3. 修饰引用,指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函数对值的修改;

  4. 修饰成员函数,说明该成员函数内不能修改成员变量。

7、static的作用

这个是C和C++共有的,非常重要。

  1. 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。

  2. 修饰普通函数,表明函数的作用范围,仅在定义该函数的文件内才能使用。在多人开发项目时,为了防止与他人命名空间里的函数重名,可以将函数定位为 static。

  3. 修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。

  4. 修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数内不能访问非静态成员。

8、this指针

  1. this 指针是一个隐含于每一个非静态成员函数中的特殊指针。它指向调用该成员函数的那个对象。

  2. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给 this 指针,然后调用成员函数,每次成员函数存取数据成员时,都隐式使用 this 指针。

  3. 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。

  4. this 指针被隐含地声明为: ClassName const this,这意味着不能给 this 指针赋值;在 ClassName 类的 const 成员函数中,this 指针的类型为:const ClassName const,这说明不能对 this 指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作);

  5. this 并不是一个常规变量,而是个右值,所以不能取得 this 的地址(不能 &this)。

9、inline内联函数

  • 相当于把内联函数里面的内容写在调用内联函数处;

  • 相当于不用执行进入函数的步骤,直接执行函数体;

  • 相当于宏,却比宏多了类型检查,真正具有函数特性;

  • 编译器一般不内联包含循环、递归、switch 等复杂操作的内联函数;

  • 在类声明中定义的函数,除了虚函数的其他函数都会自动隐式地当成内联函数。

10、extern "C"

  • 被 extern 限定的函数或变量是 extern 类型的

  • 被 extern "C" 修饰的变量和函数是按照 C 语言方式编译和链接的

extern "C" 的作用是让 C++ 编译器将 extern "C" 声明的代码当作 C 语言代码处理,可以避免 C++ 因符号修饰导致代码不能和C语言库中的符号进行链接的问题。

11、C语言实现C++类

C 实现 C++ 的面向对象特性(封装、继承、多态)

  • 封装:使用函数指针把属性与方法封装到结构体中

  • 继承:结构体嵌套

  • 多态:父类与子类方法的函数指针不同

12、::范围解析运算符

  1. 全局作用域符(::name):用于类型名称(类、类成员、成员函数、变量等)前,表示作用域为全局命名空间

  2. 类作用域符(class::name):用于表示指定类型的作用域范围是具体某个类的

  3. 命名空间作用域符(namespace::name):用于表示指定类型的作用域范围是具体某个命名空间的

13、右值引用

右值引用就是必须绑定到右值(一个临时对象、将要销毁的对象)的引用,一般表示对象的值。

右值引用可实现转移语义(Move Sementics)和精确传递(Perfect Forwarding),它的主要目的有两个方面:

  • 消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。

  • 能够更简洁明确地定义泛型函数。

14、多态

  1. 多态,即多种状态(形态)。简单来说,我们可以将多态定义为消息以多种形式显示的能力。

  2. 多态是以封装和继承为基础的。

  3. C++ 多态分类及实现:

  • 重载多态(Ad-hoc Polymorphism,编译期):函数重载、运算符重载

  • 子类型多态(Subtype Polymorphism,运行期):虚函数

  • 参数多态性(Parametric Polymorphism,编译期):类模板、函数模板

  • 强制多态(Coercion Polymorphism,编译期/运行期):基本类型转换、自定义类型转换

15、智能指针

  1. shared_ptr

  2. unique_ptr

  3. weak_ptr

  4. auto_ptr(被 C++11 弃用)

  • Class shared_ptr 实现共享式拥有(shared ownership)概念。多个智能指针指向相同对象,该对象和其相关资源会在 “最后一个 reference 被销毁” 时被释放。为了在结构较复杂的情景中执行上述工作,标准库提供 weak_ptr、bad_weak_ptr 和 enable_shared_from_this 等辅助类。

  • Class unique_ptr 实现独占式拥有(exclusive ownership)或严格拥有(strict ownership)概念,保证同一时间内只有一个智能指针可以指向该对象。你可以移交拥有权。它对于避免内存泄漏(resource leak)——如 new 后忘记 delete ——特别有用。

写在最后

如果是对于只会C,想学C++的程序员,这些知识点其实远远不够,但是能起到一个打开新世界大门的作用。C++很多特性需要在实战中体会伟大,本文确实有些虎头蛇尾!后几篇会先专注于网络编程,敬请期待!

参考:

  • 《后台开发:核心技术与应用实践》
  • 《Essential C++》
  • 《Effective C++》
  • 《深入探索C++对象模型》
  • 《深入理解C++ 11》
  • 《Linux高性能服务器编程指南》
  • https://mp.weixin.qq.com/s/7mx58Idw1pL0MjPIFBUB1Q
  • https://blog.csdn.net/xiedejun1984/article/details/5730249?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-1.control

你可能感兴趣的:(手把手写C++服务器,服务端编程,C++填坑)