class中就应该包含两个部分,一个是复数,包括实部和虚部;第二部分就是能够对复数作用的函数,比如加减乘除。可以创造很多个复数的数值存储在内存地址中,函数就只需要一套地址。
字符串
对于string,字符串里面有一根指针,指向一串字符。当想要设计一个class需要指针时,需要很小心。
基于对象
面对的是单一的class的设计。
面向对象
面对的是多重classes的设计,classes 和classes之间的关系。
C++的代码基本形式
c++代码分为三个部分:头文件,主程序和标准库。
主程序使用头文件要用:#include<iostream.h> 相当于是python中引用库的意思:import pandas as pd。如果你需要引用你自己写的东西,用"":#include "complex.h"
标准库也是以头文件的形式:.h(header files),也要 #include <>。
#include <iostream.h>
using namespace std;
int main(){
int i = 7;
cout << "i=" << i <<endl;
//想象是右边的到cout屏幕中,一个一个丢。其实是"流"的意思。
return 0;
}
头文件header的写法
#ifndef__COMPLEX__
#define__COMPLEX__
//防卫式声明
#endif
告诉编译器,如果没有命名complex,定义complex。
头文件布局
//0:
//include <cmath>
class ostream;
class complex;
complex&
__doapl (complex* ths, const complex&);
//1: class declarations 函数的声明
class complex
{
};
//2: class definition 函数的定义
complex::function...
写一个复数:#1 声明 //符号为cpp的注释,和python不同。
//class head 任何一个class要有一个head
template<typename T>
class complex
{
private:
T re, im; //re 实部 im 虚部 T只是一个后面的数的类型的模型
friend complex&__doapl (complex)
};
{
complex<double> c1(2.5,1.5);
complex<int> c2(2,6);
//complex<double>代表,在complex的类中,用double的类型的数值,也就是用double指明为T。
}
inline 内联函数
(1)将inline函数体复制到inline函数调用点处; (2)为所用inline函数中的局部变量分配内存空间; (3)将inline函数的的输入参数和返回值映射到调用方法的局部变量空间中; (4)如果inline函数有多个返回点,将其转变为inline函数代码块末尾的分支(使用GOTO)。
理解:相当于一个外面的方程,调用这个方程时就用这个方程。并且,它和调用函数不同,是复制。如果是在函数本体内定义,就是inline function。
比如:
访问级别
//求0-9的平方
inline int inlineFunc(int num){
if(num>9||num<0)
return -1;
return num*num;
}
int main(int argc,char* argv[]){
int a=8;
int res=inlineFunc(a);
cout<<"res="<<res<<endl;
}
public: 和 private: 数据部分应该是private,函数部分放在public。
{
complex c1(2,1); //创建一个对象complex,调用函数complex
cout << c1.real(); //通过real函数得到实部
cout << c1.imag(); //通过imag函数得到虚部
}
{
complex c1(2,1); //创建一个对象complex,调用函数complex
cout << c1.re; //直接拿c1的实部
cout << c1.im; //直接拿c1的虚部
//两个操作都不行,因为re和im的值是封装在private中的。只能通过调用public的函数拿。
}
构造函数
构造函数可以有很多个 overloading(重载) 相同函数有一个以上
class complex
{
public:
complex (double r=0, double i = 0) //函数和类名称要一致 可以拥有参数 参数可以有默认值 如果创建值时没有指明就用默认值 构造函数没有返回值(return),因为它就是创建class complex
: re (r), im (i) //initialization list(初始值) 把r设到re中,把i传到im中。为什么要放到这里,而不是在大括号里?一个值,应该先初始化,再赋值。这个阶段就是初始化。赋值怎么赋值呢? {re = r; im = i;}
{}
}
这里,先复习函数基本知识:
要使用C++函数,必须完成如下工作:提供函数定义;提供函数原型;调用函数。
演示:好了,从定义函数开始。
#include <iostream>
void simple();
int main()
{
using namespace std;
cout<<"main()will call the simple() function.\n";
simple(); //function call
cout<<"main() is finished with the simple() function. \n";
// cin.get();
return 0;
}
void simple()
{
using namespace std;
cout<<"im but a simple.\n";
}
函数分为有返回值的,没返回值的。没返回值的称为void函数。其通用格式如下:
void functionname(paraterlist)
{
statements;
return; //optional 标记了函数的结尾
}
//没返回值的函数
using namespace std;
void cheers(int n)
{
for (int i =0; i<n; i++)
cout<<"cheers"<<endl;
cout<<endl;
}
int main()
{
cheers(10);
}
//有返回值的函数,必须使用返回语句,以便将值返回给函数,然后返还给调用函数。
//怎么返还的呢?函数通过将返回值复制到指定的cpu寄存器或者内存单元中来将其返回。然后,调用函数将查看这个内存单元。
下面是函数原型,经常隐藏在include中。就是include后面那2个。函数参数和按值传递
#include <iostream>
using namespace std;
void cheers(int); //no return value
double cube(double x); //returns a double 这里是,输入的必须是double,返回的也是。输入的类型声明在x前面,返回的类型在cube前面。
int main()
{
cheers(5); //调用没返回值的函数。函数名cheers加上参数5,再加上分号 ;。
cout<<"GIve me a number";
double side;
cin >> side;
double volume = cube(side); //调用有返回值的函数cube,在这里有返回值,让调用函数main调用,拿到地址,可以用来赋值给volume。
cout <<"A"<<side<<"foot cube has a volume of ";
cout <<volume << "cubic feet.\n";
cheers(cube(2));
return 0;
}
void cheers(int n)
{
using namespace std;
for (int i=0 ; i < n; i ++ )
cout<<"cheer"<<endl;
}
double cube(double x)
{
return x*x*x;
}
用于接收传递值的变量叫做形参。传递给函数的值称为实参。实参:argument 形参:parameter。
double cube(double x);
int main()
{
double side = 5; //创建side变量,将5赋值给它
double volume = cube(side); //将值5传递给cube函数
}
double cube(double x) //创建变量x,将传递的值5赋值给它
每个函数都有自己的变量,每个变量都有自己的值。
void n_char( char c, int n) //two argument
函数可以有多个参数,用逗号隔开。