【侯捷】C++面向对象程序设计

C++ 侯捷课程知识整理 前言 本文整理C++基础知识,用于开发中日常查阅。 引用 智能指针 const关键字 const修饰变量 const修饰的变量也称为常量。 使用关键字const对限定变量的值,避免其他操作改变该值,不可修改; const 数据类型 变量名 = 常量值 const对象一旦创建后就不能改变,所以必须对其进行初始化。 默认情况下,const对象仅在文件内有效。 编译器在编译过程中会把用到该const变量都替换成对应的值。 添加volatile后,可以禁止编译器对该值进行优化,必须在运行时去读取该c 阅读详情

本系列相关链接:
【侯捷】C++11

0. 课程目标

  • 培养正规、大器的编程习惯
  • 良好方式编写class,做“有生产力”的开发工程师
  • 学习class之间的关系

c++98 (1.0)
c++11 (2.0) <–目前大多数公司使用,成熟、通用
c++14 c++17 c++20

C++包括C++语言、C++标准库;

C++class分两种,一种带指针(资源)(例如string),一种不带指针(例如complex),这个区别对class的设计影响深远。

侯捷老师的该课程共有13节,本文按课程顺序重新编节。

推荐书籍:
C++ Primer 中英文
Effective C++ 中英文(中文侯捷出品)
Effective Modern C++ 中英文,这个只讲C++2.0
THE C++ STANDARD LIBRARY,STL源码剖析(侯捷出品)

C vs C++ 关于数据与函数
C语言面向过程,数据和函数分开;
C++语言面向对象,数据和处理数据的函数封装成class,class可以实例化多个对象,每个对象有独立的数据部分,而成员函数只有一份,每个对象通过函数指针和this指针共用成员函数。

Object Based vs. Object Oriented
基于对象,面对的是单一class的设计;
面向对象,面对的是多重classes的设计,考量classes之间的关系;

1. 基于对象

1.1 头文件与类的声明

1.1.1 头文件

C++代码基本形式
标准库头文件,#include<> 尖括号;
用户头文件,#include""双引号;
编译器查找顺序,见博文:C++语言;

头文件防卫式声明(declaration)
#ifndef和#pragma,见博文:C++语言;

头文件布局
防卫式声明+标准库头文件+用户头文件+前置声明+类声明+类定义(?)
推荐做法:在头文件声明class,在源文件定义class;–>防止定义多次展开;

1.1.2 类的声明

class template
模板类,用占位符将type的指定延后到实例化对象;

class的声明
有些成员函数在class body中定义;<–自动inline
有些成员函数在class body以外定义,可能是头文件,也可能是源文件;
<–区别?

内联函数
见博文:C++语言;

访问级别
见博文:C++语言;

1.2 构造函数

1.2.1 Big Six

默认构造函数
拷贝构造函数
移动构造函数
拷贝赋值运算符
移动赋值运算符
析构函数

class A { //=delete, =default;
public:
	A() {...}             //构造
	A(const A& ) {...}    //拷贝构造
	A(A && ) {...}        //移动构造
	A& operator=(const A& a) {...} //拷贝赋值
	A& operator=(A&& other) {...} //移动赋值
	~A() {...} //析构
};

1.2.2 初始化列表

构造函数独有;
初始化类的成员有两种方式,一是使用初始化列表,二是在构造函数体内进行赋值操作。

主要是性能问题,对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表,为什么呢?使用初始化列表少了一次调用默认构造函数的过程,这对于数据密集型的类来说,是非常高效的。

1.2.3 构造函数的overloading(重载)

函数名相同,但函数签名不完全相同,则可以构成重载,这些函数同时存在:

  1. 函数名相同
  2. 返回值类型不看
  3. 形参列表个数、顺序、类型有不同
  4. const
    -const在函数尾部,属于函数签名,加const指明不修改入参;
    -const在返回值,不看;
    -const在传值形参,不看,因为改不改传值没意义;
    -const在传引用形参,属于函数签名;

注意与override(覆盖)区分,override是在面向对象角度的类多态中提出的,派生类通过对基类中虚函数覆盖来达到动态绑定的效果。要构成覆盖的条件是:
派生类的函数原型必须完全覆盖基类中的声明,包括:形参列表、返回类型、常量性(cv限定符)。

1.2.4 放在private的构造函数

单例模式,private配合static实现:

class A {
public:
	static A& getInstance();
	setup() {...}
private:
	A();             //放在private的构造函数
	A(const A& rhs); //拷贝构造
	...
};

A& A::getInstance()
{
	static A a;      //被调用时才唯一一次创建
	return a;
}

1.3 成员函数

1.3.1 常量成员函数

函数末尾加const,指明该成员函数不修改成员数据;
如果该加不加,但是用户在实例化时指定了对象是const,则会编译报错:

class complex
{
public:
    double real() const { return re;}
private:
    double re;
}
///////
const complex c1(2,1);
cout << c1.real();  //如果上面没定义为常量成员函数,则此处报错;

1.3.2 传值 vs. 传引用

数据占内存很大的时候,传值代价很大,在C语言中可以传指针,在C++语言中推荐使用引用;
引用与指针的区别见:博文:C++语言;
引用的传递也要注意指定是否const,是否修改引用的内容;

形参如此,返回值也如此!
如果函数返回值是在函数内部创建出来的,则不能传引用出去,因为出了函数这个东西就死掉了;

1.4 友元

友元打破c++的封装性,但取数据比函数方式更快;

class complex
{
private:
    double re;
    friend complex& __doapl(complex*, const complex&);
}
///////
inline complex& __doapl(complex* a, const complex& b) {
    a->re += b.re; //哪怕是私有成员变量,友元函数也可以直接取数据
    return *a;
}

相同class的各个对象互为friends;

class complex
{
public:
    int funcA(const complex& param) {return param.re + param.im;}
private:
    double re, im;
}
///////
complex c1(2,1);
complex c2;
c2.func(c1); //此处,c2和c1互为友元,所以c2能直接取c1的私有数据;

1.5 操作符重载

c++中操作符就是一种函数,因此操作符也可以重载overloading;

1.5.1 this指针

所有的成员函数都带有一个隐藏的this指针,可以直接使用;

class complex
{
public:
    inline complex& // 有返回值,注意1.5.3
    operator += (const complex& r) // 接收者1
    {return __doapl(this, r);}
    inline complex& // 接收者2
    __doapl(complex* ths, const complex& r) 
    {...; return *ths;} //传递者2
}
///////
c2 += c1; // 传递者1

1.5.2 reference的传递与接受

传递者无需知道接收者是否以reference形式接收;

1.5.3 连续操作

用户可能连续操作,因此操作符重载函数的返回值不应该写成void;

c3 += c2 += c1;

1.5.4 临时对象

typename(),没有名称,它的生命在下一行就消失;
例如:

complex c1(2,1);
complex(3,4); // 临时对象,标准库中常用于return语句;

1.5.5 成员函数重载vs.全局函数重载

complex c1(3,1);
cout << conj(c1);
cout << c1 << conj(c1);

<<作用于cout,因此,<<的重载必须是全局函数形式;

ostream& // 为了能连续操作,返回值类型不能是void,同+=的重载
operator << (ostream& os, const complex& x)
{
    return os << '(' << x.real() << ',' << x.img() << ')';
}

2. 带资源的基于对象

class的成员变量包含指针、资源,那么就要额外管理这份资源;

2.1 Big Three

书籍中提到的“Big Three"指:拷贝构造(创建新对象)、拷贝赋值、析构;

String s1("hello");
String s2(s1); 
String s2 = s1; //等同于上一行,s2是新创建的对象,因此此处调用拷贝构造函数,而不是拷贝赋值函数
String s2;
s2 = s1; //调用拷贝赋值函数

编译器提供的默认拷贝构造、拷贝赋值,只是忠实的浅拷贝。

2.1.1 析构函数

inline String::String(const char* cstr = nullptr)
{
  if(cstr == nullptr) {
    m_data = new char[1];
    *m_data = '\0';
  } else {
    m_data = new char[strlen(cstr)+1];
    strcpy(m_data, cstr); //深拷贝
  }
}
inline String::~String() { delete[] m_data;} //注意delete[]释放数组

2.1.2 拷贝构造

只要做一次深拷贝就可以了;

2.1.3 拷贝赋值

另外,拷贝赋值要注意:自拷贝、原数据释放、新数据深拷贝。

inline String& String::operator=(const String& str)
{
  if(this == &str) { return *this;} //比如指针换名字了,子类父类传了多次等
  delete[] m_data;
  m_data = new char[strlen(str.m_data) + 1]; //没做自拷贝检测的话,这里已经跑飞了,error
  strcpy(m_data, str.m_data);
  return *this;
}

2.2 栈stack与堆heap

2.2.1 stack/heap/static/global

stack,是存在于某scope的一块内存空间。例如调用函数,函数本身即会形成一个stack用来放置它所接收的参数,以及返回地址。
在函数体内声明的任何变量,其所使用的内存块都取自上述stack。
因此,超出这个scope后,其生命自动结束。

heap,是指由操作系统提供的一块global的内存空间,程序可动态分配从其中获得若干区块(block)。
因此,手动申请后,还需要主动释放。

global全局变量,其生命在作用域结束后仍然存在,直到整个程序结束,且可以用extern跨文件;
详见:博文:C++语言;

static 局部变量,其生命在作用域结束后仍然存在,直到整个程序结束,但不能跨文件;
静态成员变量只有一份,所有实例、类本身都访问同一个;
静态成员变量的定义必须在class外部;
静态成员函数没有this指针,只用于存取静态数据,可以通过对象访问,也可以通过class name访问;

class Account{
public:
  static double m_rate;
  static void set_rate(const double& x);
};
double Account::m_rate = 8.0;
//////
Account::set_rate(5.0); //注意不是.,是::
Account a;
a.set_rate(3.0);

2.2.2 new/delete

new三步:

  1. 调malloc申请内存;
  2. static_cast数据类型转换;
  3. 调用构造函数;

delete两步:

  1. 调用析构函数;
  2. 调free释放内存;

调试模式下,new得到多少内存?假设一个复数本身占用8字节,则new时:
首尾各4字节cookie,32字节调试信息,8字节数据,4字节no man land,12字节填充 = 64字节;
release模式下,首尾各4字节cookie,8字节数据,16字节对齐 = 64字节;

cookie用于释放内存时计算起止地址;
64字节用十六进制表示就是0x40,最后一个bit的1表示这块内存被分配出去了正在使用。如果内存被还给操作系统,则最后一个bit就会变成0;
在这里插入图片描述

2.2.3 array new/delete[]

在这里插入图片描述
array new如果不搭配delete[]而是delete,则整块内存仍然被释放,但是第一个资源后面的所有资源都没有被析构,内存泄漏!

2.3 更多细节

以下细节也很重要,详见【侯捷】c++11。
在这里插入图片描述

3. 面向对象

3.1 复合、继承、委托

3.1.1 复合

复合,就是A中有B,构造由内而外;composition, has a
复合,构造由内而外,析构由外而内,这些代码是编译器为你自动添加的、调用默认函数,如果不是你想要的,就得自己指定。

下例中,已有一个强大的class A,现在把它做一定限制,形成一个限制版本的class B,这种设计模式称为”装饰器“。

template <typename T>
class queue {
protected:
  deque<T> c;
}

在这里插入图片描述

3.1.2 委托

委托,就是A中有指向B的指针;delegation, composition by reference
这种设计模式称为"pimpl",或者Handle and Body,“编译防火墙”;
在这里插入图片描述
一个非常常见的用法,是智能指针的引用计数。
共享很好,但是如果想修改指向的值,需要单独拷贝一份出来给它改,这种设计模式称为copy-on-write,或者“写时拷贝”,COW。
在这里插入图片描述

3.1.3 继承

继承,A is a B;空心三角箭头,由子类指向父类;
继承,构造先调用父类的构造函数,再构造自己;析构先执行自己,再调用父类的析构函数:

Derived::Derived(...) : Base(){...};
Derived::~Derived(){...; ~Base(); };

在这里插入图片描述
public/private/protect继承方式见:博文:C++语言;

  • 公开继承:该访问说明符之后列出的基类的公开和受保护成员在派生类中保持其访问级别,而基类的私有成员对派生类不可访问
  • 受保护继承:该访问说明符之后列出的基类的公开和受保护成员在派生类中是受保护成员,而基类的私有成员对派生类不可访问
  • 私有继承:该访问说明符之后列出的基类的公开和受保护成员在派生类中是私有成员,而基类的私有成员对派生类不可访问

3.2 多态、虚函数

3.2.1 virtual函数

  • 非虚函数:你不希望子类重新定义(覆盖,复写,override)它;
  • 虚函数:你希望子类重新定义它,但也可以用父类已有的默认定义;
    父类的析构函数必须是虚函数;
  • 纯虚函数:你希望子类一定要定义它;

继承和虚函数搭配,非常强大的多态;
先写大框架,而把具体的关键步骤延缓到子类的实现,这种设计模式称为“Template Method",大名鼎鼎;一般性的框架不是核心竞争力,而在于你的领域知识(domain knowledge)。

3.2.2 继承+复合

在这里插入图片描述
情况1.
构造:Base, Component, Derived;
析构:Derived, Component, Base;

情况2.
构造:Component, Base, Derived;
析构:Derived, Base, Component;

3.2.3 委托+继承

Composite
这是最经典、超强大的设计模式”Composite";
在这里插入图片描述
Prototype
为了创建未来的子类的对象,设计模式称为“Prototype”,出处《Design Patterns Explained Simply》。
下图中static用下划线表示;-表示私有,#表示保护,+表示公有;

静态变量:数据类型
函数名():返回值类型
在这里插入图片描述

侯捷C++视频笔记——C++面向对象高级编程(上) C++面向对象高级编程(上) 01、C++编程简介 学习目标: 1.学习良好的编写C++类的形式,包括两种,分别是无指针成员类(如Complex)和有指针成员类(如String) 2.学习类之间的关系,即继承,复合和委托。 02、头文件和类的声明 1.C和C++在数据和函数的区别: C中存在数据以及函数,函数用来处理数据。缺点是缺少关键字管理数据,数据均为全局,难以作限制 C++中通过类将数据和函数包在一起,以类为个体来创建对象。是面向对象的语言。 2.防卫式声明: #ifndef _name_ #defi 阅读详情

相关推荐

侯捷 C++ 课程学习笔记:由浅入深,步入C++世界大门

侯捷老师在 C++ 领域堪称权威,有着深厚的技术底蕴,他的讲解风格深入浅出,能把复杂的 C++ 知识以通俗易懂的方式呈现出来。课程从基础语法开始,逐步深入到内存管理、模板编程、STL 等高级主题,层层递进,构建起一个完整的知识体系,为学习者照亮了前行的道路。

qq_58611691的博客 1497

侯捷C++系列精品课体验课

侯捷C++系列课程包含集结了《 STL 标准库与泛型编程》、《 C++ 新标准 11/14 》、《 C++ 面向对象开发》、《 C++ 内存管理机制》精华课程,全面覆盖 C++ 核心技术,帮助开发者从基础到深入,逐步掌握现代 C++ 编程精髓。150+课程视频请戳>>https://edu.youkuaiyun.com/cloud/houjie

Label Studio保姆级教程:从零搭建医疗影像标注平台(DICOM格式支持)

本文提供基于Label Studio从零搭建医疗影像标注平台的保姆级教程。针对DICOM格式支持,详细阐述了环境部署、DICOM深度集成与预处理、团队协作权限管理以及质量审核闭环等核心环节,旨在构建一个高效、可落地的医疗AI数据标注解决方案,助力模型落地。

nft7creator的博客 302

侯捷老师《C++面向对象高级编程-1》学习笔记

继承关系下的构造函数执行过程:构造由内到外:即先执行基类的构造函数,然后再执行自己。代码类似于:Base(){ ... };析构由外而内:即先执行子类的析构函数,然后再执行自己的。代码类似于:~Base();

weixin_42455459的博客 1192

Mac和VScode配置fortran

macOS系统 vscode fortran gfortran 终端

weixin_43047707的博客 2409

生物信息学工具链搭建:用conda一键搞定MCScanX所有依赖(Ubuntu20.04实测)

本文详细介绍了在Ubuntu20.04系统上使用conda一键部署MCScanX及其所有依赖的高效方法,解决了传统源码编译安装中的依赖冲突问题。通过conda环境管理工具,研究者可以快速搭建生物信息学工具链,实现基因组共线性分析的高效运行,显著提升研究效率。

backprop5master的博客 245

C++面向对象程序设计(侯捷)笔记

前言 再复习C++,现整理笔记如下。(以下【注】为我的注释)   写正规大气的C++代码。感谢侯捷老师! C++编程简介 你应具备的基础 曾学过某种procedural language(C语言) 变量(variables) 类型(types):int, float, char, struct … 作用域(scope) 循环(loops):while, for 流程控制:if-else, switch-case 知道一个程序需要编译、连结才能被执行 知道如何编译和连结(如何建立一个可运行程序) 【注】台

靖待的优快云博客 3758

安卓手机游戏《英雄迷宫冒险》存档修改

警告 修改前务必备份存档文件夹。该游戏有自动删除存档的功能,有问题的存档会自动删除。 修改对应的游戏版本为1.5。 存档保存位置 内部存储\Android\data\com.xmmf.yxmgmx.taptap\files 该文件夹中文件如下: data.wsf:数据文件。 wsfSave0:第一个存档。 wsfSave1:第二个存档。 修改金钱的例子 先进游戏确认当前金钱数量。当前金钱是2498,然后退出游戏。 根据金钱数量计算出存档中的内容。2498的十六进制是9C2,存档中的内容在存档中搜索该数

番茄鸡蛋的专栏 9360

【C++面向对象程序设计——侯捷大师】心得摘要

面向对象程序设计——侯捷大师

Ref.Ptr.的博客 857

Vue - 详细完美解决 ElementUI MessageBox “多次“ 弹框问题,让其无论执行多少次都只弹出来一次(常见于请求拦截器多次触发弹框,导致弹出来很多个)详细示例代码,保证完美解决!

vue如何防止ElementUIMessageBox多次弹框,vueelement弹框弹出来很多次怎么办,elementvueMessageBox解决执行多次后出现多次弹框的问题,elementUI如何阻止MessageBox多次弹出来,vue+element解决多个请求同时报错,弹出多个消息框message,饿了么组件库MessageBox弹框频繁弹出解决方法,vue调用MessageBox出现多次弹框,vueelementMessageBox怎么只弹出一次,vue之axios请求

🏆 前端领域优质创作者 8194

[VCS]门级仿真及SDF反标

摘要:门级仿真在STA工具普及后仍是验证的重要环节,主要用于检查SDC完备性、异步电路时序、网表完整性及为功耗分析提供波形。门级仿真分为不带时序反标的前仿和带SDF反标的后仿,后仿需加载SDF文件提供精确延时信息。VCS提供多种仿真选项控制时序检查行为,SDF反标可通过命令或系统函数实现。后仿需特别注意关闭notimingcheck选项以确保时序检查有效性,并建议检查SDF反标报告和波形验证延时一致性。

元直的博客 9787

侯捷--C++面向对象程序设计笔记

学习笔记,仅供参考,图片来源于网络

weixin_57950256的博客 1871

【反卷积算法】Richardson-Lucy (RL) :通过不断迭代更新图像估计值

Richardson-Lucy(RL)反卷积算法:是一种基于最大似然估计(Maximum Likelihood Estimation, MLE)的图像去卷积方法,常用于去模糊和图像增强。通过不断地更新图像估计值,来最小化模糊图像和恢复图像之间的误差,逐步消除模糊,最终接近真实的原始图像,每次迭代都会根据当前估计的图像来修正下次迭代的结果。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 3035

侯捷 c++ 面向对象程序设计

class中有指针,多半是要做动态分配,则一定要有析构函数,delete字符串以下public里面从上往下,分别是构造函数、拷贝构造函数、拷贝赋值、析构函数。最后一个是一个成员函数,传回指针,不改变data,所以要加上const。字符串有多长,有两种设计思路,一种是在字符串最后有个结束符号,另一种是在字符串定义初规定字符串的长度。有构造函数,就要有对应的析构函数,释放内存。析构函数会被自动调用class里有指针,多半是要做动态分配的。如果有指针的成员函数,但是没有对应的构造函数和析构函数。

Rootzzy1216的博客 253

医院批量排班实战指南(三)日期列表生成与时段批量操作

在上一篇《批量排班功能实现指南(二):日期与时段设置》中,我们完成了日期范围选择和重复规则配置的界面搭建,实现了从第一步到第二步的跳转功能。现在我们已经可以选择日期范围和重复规则,但还缺少最关键的功能——根据规则生成日期列表并进行时段配置。本篇将继续深入批量排班的核心功能——日期列表生成与时段批量操作。根据日期范围和重复规则智能生成日期列表为每个日期配置上午、下午、夜诊时段批量时段操作提升配置效率日期列表的展示与管理。

低代码布道师的博客 1345

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++学习10:侯捷C++面向对象程序设计总结

这里总结一下C++学习4-9,加深印象以备后续学习。 1 三大部分 1.1 不带指针的类 C++学习4:详解不带指针的类(侯捷Complex类为例) C++学习8:模板初步理解 1、基本知识:各种声明、类的定义、内联函数、访问级别、构造函数、重载、参数传递方式、返回方式、各种位置出现的const、友元、模板。 2、操作符重载:成员函数、非成员函数、全局函数。 3、设计类时一定要注意的细节: (1)...

时间有泪 938

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

侯捷 c++ 面向对象程序设计总结

目录 一、类的设计初步 类的设计初探,关于不涉及指针的类 防卫式声明、头文件布局、inline、访问级别、构造函数 对应1、2、3节 二、complex类的设计与实现 complex类的设计过程 const函数、运算符重载、参数传递、返回值传递 对应4、5、6节 三、String类的设计与实现 关于带指针的类的设计 构造函数、析构函数、拷贝构造函数、拷贝赋值运算符 new和delete 对应7、8、9节 四、单个类的设计所需的其余知识 static、函数模板 对应10节 五、类与类之间的关系

Mirevas的博客 401

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

侯捷 - C++面向对象程序设计I(学习笔记)

Object-Based(基于对象):单一类Object-Oriented(面向对象):关联类B语言——C语言——C++语言(newC->C with Class->C++)书籍推荐:深度探索C++对象模型STL源码剖析。

weixin_44553525的博客 1252

C++面向对象程序设计II--侯捷版

C++面向对象程度设计II

m0_51451952的博客 165

C++面向对象程序设计I -- 侯捷版

C++面向对象程序设计

m0_51451952的博客 178

C++面向对象程序设计(侯捷)学习笔记(一)

1. 课程目标 (1)以良好的方式编写C++的class,基于对象(Object Based)--面对的是单一class的设计 不带指针的类(class without pointer members) 带指针的类(class with pointer members) (2)学习classes之间的关系,面向对象(Object Oriented)--面对的是多重classes的设计,classes和classes之间的关系。 继承 复合 委托 (3)C++学习内容:分为基础语言和标准库的学习

m0_51787822的博客 481

侯捷 - C++面向对象程序设计II(学习笔记)

【代码】侯捷 - C++面向对象程序设计II(学习笔记)

weixin_44553525的博客 522

侯捷C++面向对象程序设计笔记(上)-Object Based(基于对象)部分

基于对象就是对于单一class的设计。 对于有指针的:complex.h complex-test.cpp 对于没有指针的: string.h string-test.cpp 没有指针成员——以复数complex类为例 一. 头文件的写法 从下图可以看到,头文件由四个部分组成: 防卫式声明 即头文件的最上面两行和最下面两行 前置声明 类的声明 类的定义 A. 类的声明 这里以构造复数类为例,可以看到这个类中明显的有数据和函数两部分。对于数据部分,这里定义的是double类。 a. 模板 如果我

SLAM小土堆 490

c++面向对象程序设计-侯捷(课件笔记)(未完待续)

qq_36421001的博客 932

阅读侯捷和孟岩翻译的C++标准程序库有感

        刚刚在当当网上定了一本侯捷和孟岩翻译的《C++标准程序库》,此书之厚度不亚于我所读过的侯捷的另一本书《MFC深入浅出》,当时想想这本书所给我带来的冲击是史无前例的,让我对C++的面向对象特性有了一个新的认识,可是刚刚看了几天刚买的那本《C++标准程序库》发现基本上都能看懂(以前看过电子版的当时 那些概念看得我云里雾里的),让我对C++的认识有上了一个层次,发现原来C++这门优秀的程序设计语言真的有其他语言所不能替代的优势,为标准库的设计者们的设计思想和理念所折服,真是验证了那句话,只有你想不

踏雪无痕 2476

侯捷 C++ 课程学习笔记:设计模式在面向对象开发中的应用

通过学习侯捷老师的《C++ 面向对象开发》课程,我对设计模式有了更深刻的理解,并将其应用到了实际项目中。侯捷老师清晰的讲解和丰富的实战案例让我受益匪浅。在学习过程中,我深刻体会到了设计模式的灵活性、代码的可维护性以及面向对象设计原则的重要性。在未来的学习中,我将继续深入学习侯捷老师的其他课程,如《C++ STL 标准库与泛型编程》和《C++ 新标准 11/14》,进一步提升自己的 C++ 编程能力。我相信,在侯捷老师的指导下,我能够在 C++ 的世界中不断进步,成为一名优秀的开发者。

GGDxianv的博客 1480
上一篇: 【tvm官网教程01】设计和架构-1
下一篇: 【侯捷】C++程序设计II--兼谈对象模型
BesiseB
博客等级 码龄14年 92粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值