C++语言编写时需要注意的规范:
re(r), im(i) { }
;主程序;
扩展名不一定是.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;
}
//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 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还是编译器决定。
// 正确的调用
{
complex c1(2, 1);
cout << c1.real();
cout << c1.imag();
}
// 错误的调用
{
complex c1(2, 1);
cout << c1.re;
cout << c1.im;
}
错误是因为调用了private内的数据。
// 正确的调用
complex (double r = 0, double i = 0) :re(r), im(i) {
}
:re(r), im(i)
是初值列(initialization list),含义是将r
赋值给re
,将i
赋值给im
;重载(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;}//给实部赋值
//单例(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();
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
complex( double r=0 ,double i=0): re(r), im(i) {
}
ostream&
operator<<(ostream& os, const complex& x)
{
return os<<'('<<real(x)<<','<<imag(x)<<')'
}
complex& operator += ( const complex&);
所以,变量传递尽量传递引用,如果不希望值被修改,可以传递常量引用。
返回值得传递也要尽量return by reference。
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);
}
当一个变量是类的内部变量时,函数调用结束,值对应的空间就释放掉了,这时,不能向外界传递该值得引用,该引用也是一个坏值。
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编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
撤销: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.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
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 |
一个具有注脚的文本。2
Markdown将文本转换为 HTML。
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::
这将产生一个流程图。:
我们依旧会支持flowchart的流程图:
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
mermaid语法说明 ↩︎
注脚的解释 ↩︎