C++面向对象高级编程(侯捷)——听课笔记

这里写自定义目录标题

  • 欢迎使用Markdown编辑器
  • 0.写在前面
  • 1.C++程序代码的基本形式
    • 1.1 C++文件类型
    • 1.2 头文件的正规写法
    • 1.3 构造函数
    • 1.4参数传递与返回值
    • 1.5友元(friend)
    • 1.6操作符重载
    • 新的改变
    • 功能快捷键
    • 合理的创建标题,有助于目录的生成
    • 如何改变文本的样式
    • 插入链接与图片
    • 如何插入一段漂亮的代码片
    • 生成一个适合你的列表
    • 创建一个表格
      • 设定内容居中、居左、居右
      • SmartyPants
    • 创建一个自定义列表
    • 如何创建一个注脚
    • 注释也是必不可少的
    • KaTeX数学公式
    • 新的甘特图功能,丰富你的文章
    • UML 图表
    • FLowchart流程图
    • 导出与导入
      • 导出
      • 导入

欢迎使用Markdown编辑器

0.写在前面

C++语言编写时需要注意的规范:

  1. 数据一定放在private中;
  2. 参数尽可能以reference(const)传递;
  3. 返回值尽量以reference传递;
  4. 在类的本体函数中,能加const的尽量加;
  5. 构造函数使用re(r), im(i) { };

1.C++程序代码的基本形式

1.1 C++文件类型

  • .h文件:
    • 头文件:声明;
    • 标准库.
  • .cpp文件:
    • 主程序;

      • 主程序中引用头文件的声明为***#include"iosteam.h"***形式;
      • 引用标准库的声明为***#include*** .

      扩展名不一定是.h或.cpp,也会根据编译器的不同有所不同,有可能无扩展名。

      // C++代码
      #include <iosteam.h>
      using namespace std;
      int main()
      {
               
      	int i=7;
      	cout << "i="<<i<<endl;
      
      	return 0;
      }
      // C代码
      #include<stdio.h>
      
      int main()
      {
               
      	int i=7;
      	printf("i=%d \n", i);
      
      	return 0;
      }
      

1.2 头文件的正规写法

  • 防卫式声明
//comlex.h
//防卫式声明
#ifndef_COMPLEX_//如果未定义过COMPLEX,不会重复include同一个函数
				//名称一般大写
#define_COMPLEX_//定义COMPLEX函数

.....

#endif//结束
  • 引用程序举例
//complex-test.h
#include <iosteam.h>
#include "complex.h"
using namespace std;

int main()
{
     
	complex c1(2,1);
	complex c2;
	cout<<c1<<endl;
	cout<<c2<<endl;

	c2=c1+5;
	c2=7+c1;
	c2+=c1;
	c2+=3;
	c2=-c1;
	
	cout<<(c1==c2)<<endl;
	cout<<(c1!=c2)<<endl;
	cout<<conj(c1)<<endl;
	
	return 0;
}
  • 头文件的布局
#ifndef_COMPLEX_
#define_COMPLEX_

//前置声明
#include <cmath>

class osteam;
class complex;
complex&_doapl(complex* ths, const complex& r);

//类-声明
class complex
{
     
	...
};

//类-定义
complex::function ...
#endif
  • class-声明举例
class complex	//class head
{
     				//class body
public:
	comlpex(double r=0, double i=0)
		: re (r), im(i)
	{
     }
	complex& operator += (const complex&);
	double real () const{
      return re; }
	double imag () const{
      return im; }
pravite:
	double re, im;

	friend complex&_doapl(copmlex*, const complex&);
};

{
     
	complex c1(2, 1);
	complex c2;
	...
}
  • 模版
template<typename T>//模版的声明
class complex
{
     
public:
	comlpex(T r=0, T i=0)
		: re (r), im(i)
	{
     }
	complex& operator += (const complex&);//此函数无大括号,在此处只是声明
	T real () const{
      return re; }//此两函数有大括号{},即在此处定义
	T imag () const{
      return im; }
pravite:
	double re, im;

	friend complex&_doapl(copmlex*, const complex&);
};

{
     
	complex<double>c1(2.5, 1.5);
	complex<int>c1(2, 6);
}

inline函数的概念:
一个函数在函数本体内定义,是inline函数
inline函数快速性较好,但是函数过于复杂时,不能inline,是否变为inline函数由编译器决定,
上面的

	T real () const{
      return re; }//此两函数有大括号{},即在此处定义
	T imag () const{
      return im; }

就是inline function(inline函数),但是最后是否真的变成inline function是未知的,鉴于如此简单,编译器应该可以写成inline函数,

inline double
imag(const complex& x)
{
     
return x.imag();
}

以上函数虽然写成inline function,但是最后是否能成为inline function还是编译器决定。

  • 访问级别(class level)
    public与private关键字定义了class内部内容可被访问的级别。
    一般数据定义为private。
    外界要用的函数定义为public。
    public与private可交错使用,不必放在一起。
// 正确的调用
{
     
   complex c1(2, 1);
   cout << c1.real();
   cout << c1.imag();
}
// 错误的调用
{
     
   complex c1(2, 1);
   cout << c1.re;
   cout << c1.im;
}

错误是因为调用了private内的数据。

1.3 构造函数

// 正确的调用
complex (double r = 0, double i = 0) :re(r), im(i) {
      }
  1. 构造函数的函数名称一定与类的名称相同;
  2. 构造函数可以拥有参数;
  3. 参数可以有默认值;
  4. 构造函数无返回类型;
  5. :re(r), im(i)是初值列(initialization list),含义是将r赋值给re,将i赋值给im
  6. 外部程序不能调用类中的构造函数,通过建立变量的语句,类会自动调用;

重载(overloading)——构造函数可以有很多个

class complex
{
     
	public:
		complex (double r = 0, double i = 0) :re(r), im(i) {
      }
		complex () : re(0), im(0) {
      }
		//以上两行不能同时存在,编译器会产生混乱
		complex& operator += (const complex&);
		double real () const{
     return re;}//取得实部
		double imag () const{
     return im;}
	private:
		double re, im;
		friend comlex&_doapl (complex*, const complex&);
};
void real(double r) ~~const~~  {
     re=r;}//给实部赋值
  1. 重载:同一个函数名称对应多个函数;
  2. 两个相同函数名称的函数,在编译器编译后的函数是不同的;
  3. 有默认值的构造函数不能重载;
  4. 可以将构造函数放入private区域内,此时,外部程序不可以调用构造函数,即变量不可以被创建;
//单例(Singleton)
class A
{
     
public:
	static A& getInstance();
		setup() {
     ...}
private:
		A();
		A(const A& rhs);
		...
}

A& A::getInstance()
{
     
	static A a;
	return a;
}

构造函数在private区时,说明class中只有一份,外界想要调用时需要如下写法:

A::getInstance().setup();

1.4参数传递与返回值

class complex
{
     
public:
   complex( double r=0	,double i=0): re(r), im(i) {
      }
   complex& operator += ( 	const complex&);
   double real () const {
     return re;}
   double imag () const {
     return im;}
private:
   double re, im;
   
   friend complex&_doapl(complex*, const complex&);
}

注意double real () const {return re;}中的const,这里是将实部和虚部提取出来,并不做改变,所以用const。
class中,不改变数据的函数就加上const,

如果不加const,下面的第一个调用不存在歧义,但是第二个调用会产生歧义。

   complex c1(2, 1);
   cout << c1.real();
   cout <<c1.imag();

错误的外部调用

   const complex c1(2, 1);
   cout << c1.real();
   cout <<c1.imag();

pass by value、pass by reference和pass by reference to const

  1. pass by value:传递数值,整个数值,所有内容都传递出去,字节数相同,不建议使用。
complex( double r=0	,double i=0): re(r), im(i) {
      }
  1. pass by reference:传递引用,引用的底部就相当于一个指针,传递速度很快。
ostream&
operator<<(ostream& os, const complex& x)
{
     
	return os<<'('<<real(x)<<','<<imag(x)<<')'
}
  1. pass by reference to const:传递的指针不可以被修改
complex& operator += ( 	const complex&);

所以,变量传递尽量传递引用,如果不希望值被修改,可以传递常量引用。

返回值得传递也要尽量return by reference。

1.5友元(friend)

friend complex&_doapl (complex*, const complex);
inline complex&
_doapl(complex* ths, const com;iex& r)
{
     
   ths->re += r.re;
   ths->im += r.im;
   return *ths;
}

定义为友元的函数可以调用class中的private成员。
友元函数可以直接调用private中的数据,而非friend只能通过函数来调用变量。

同一个class中的各个object互为friend。

class complex
{
     
public:
   complex( double r=0	,double i=0): re(r), im(i) {
      }
   int func(const complex& param)
   {
      return param.re + param.im; }
private:
   double re, im;
}

{
     
   complex c1(2, 1);
   complex c2;

   c2.func(c1);
}

不能return by reference的情况

inline complex&
_doapl(complex* ths, const complex& r)
{
     
   ths->re += r.re;
   ths->im += r.im;
   return *ths;
}

inline complex&
complex::operator += (const  comlpex& r)
{
     
   return_dopal(this, r);
}

当一个变量是类的内部变量时,函数调用结束,值对应的空间就释放掉了,这时,不能向外界传递该值得引用,该引用也是一个坏值。

1.6操作符重载

inline complex&
_doapl(complex* ths, const complex& r)
{
     
   ths->re += r.re;
   ths->im += r.im;
   return *ths;
}

inline complex&
complex::operator += (const complex& r)
{
     
   return_doapl(this, r);
}

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

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