基础知识
1:编写c++程序一般经过编辑,编译,连接,运行四步。
编辑:将c++源程序输入计算机的过程,文件名为cpp。
编译:将cpp文件翻译成机器语言,文件名为obj。
连接:分配内存地址后,转换成可执行程序,文件名为exe。
运行:执行exe文件,将结果显示到屏幕上。
2:函数的返回值类型在定义之时就以决定。
3:基类的公有成员采用私有继承时,在派生类中会变成私有成员。
4:数据封装:将数据与操作封装到一起形成实体,这个实体也就是类。
类也就是数据与操作的组合体,数据是类的静态特征,操作是类的动态特征。
5:派生类是基类的扩展和延伸,派生类一个来自本体,一个来自基类。
6:this指针可以保证每个对象都拥有自己的数据成员,可以共享处理这些数据的代码。
7:多态分为静态多态和动态多态,静态多态是由于参数的不同调用同名函数,动态多态是由于对象的不同调用同名函数。多态的对象都是同名函数。
8:内联函数代码量少,执行效率高,可以被频繁调用。也就是inline。
9:派生类的调用顺序是先调用基类构造函数,调用子对象,在调用派生类。析构函数反之。
10后置i++先赋值再自增,前置反之。
11自身类对象不能作为类的成员,循环定义。
12输出流的四种流 cin/cout/cerr/clog
13类是对象的抽象,对象是类的实例。
函数
八位二进制转十进制;
3_2.cpp
#include<iostream>
using namespace std;
double power(double x,int n)
{
double val=1.0,i;
for(i=0;i<n;i++)
val*=x;
return val;
}
int main()
{
int value=0;
cout<<"Enter an 8 bit binary number:";
for(int i=7;i>=0;i--)
{
char ch;
cin>>ch;
if(ch=='1')
value+=static_cast<int>(power(2,i));//强制转换,吧power(2,i)的结果由double转换成int。
}
cout<<"Decimal value is"<<value<<endl;
return 0;
}
例子3-3
编写程序求π值
arctanx=x-xxx/3+xxxxx/5-…
#include<iostream>
using namespace std;
double arctan(double x)
{
double sqr=x*x;
double e=x;
double r=0;
int i=1;
while(e/i>1e-5){
double f=e/i;
r=(i%4==1)?r+f:r-f;//判断i%4的结果是否等于1,若是1则r+f若不是1则r-f;
e=e*sqr;
i+=2;
}
return r;//注意
}
int main() {
double a=16.0*arctan(1/5.0);//整数相除结果取整若是1/5结果为0;
double b=4.0*arctan(1/239.0);
cout<<"PI="<<a-b<<endl;
return 0;
}
例3-4
寻找回文数
思路:
除10取余,取出每一位的数字。数字反置,低位充当高位,按反序构成新的数,与原数比较。
#include<iostream>
using namespace std;
bool symm(unsigned n)//判断是否为回文数
{
unsigned i=n;
unsigned m=0;
**while(i>0)
{
m=m*10+i%10;
i/=10;
}**
return m==n;//函数为bool类型,所以返回值类型也是bool类型,如果m==n为返回true,反之为false。
}
int main()
{
for(unsigned m=11;m<1000;m++)
if(symm(m)&&symm(m*m)&&symm(m*m*m))
{
cout<<"m="<<m;
cout<<"m*m="<<m*m;
cout<<"m*m*m="<<m*m*m<<endl;
}
return 0;
}
例3-5
#include<iostream>
#include<cmath>
using namespace std;
const double TINY_VALUE=1e-10;//定义一个常量
double tsin(double x)//实现sin函数
{
double g=0;
double t=x;
int n=1;
do{
g+=t;
n++;
t=-t*x*x/(2*n-1)/(2*n-2);//阶乘的实现
}while(fabs(t)>=TINY_VALUE);
return g;
}
int main()
{
double k,r,s;
cout<<"r=";
cin>>r;
cout<<"s=";
cin>>s;
if(r*r<=s*s)
k=sqrt(tsin(r)*tsin(r)+tsin(s)*tsin(s));
else
k=tsin(r*s)/2;
cout<<k<<endl;
return 0;
}
const优点
1定义一个常量,不可变性。
2便于检查,消除隐患。
3总控制
4节省空间
5提高效率,编译器不提供内存空间,而是将它保存在符号表中。
例3-7
#include<iostream>
using namespace std;
int fu2(int m)//fu1 fu2 顺序不能反。
{
return m*m;
}
int fu1(int x,int y)
{
return fu2(x)+fu2(y);
}
int main()
{
int a,b;
cin>>a>>b;
cout<<fu1(a,b)<<endl;
return 0;
}
例3-8
#include<iostream>
using namespace std;
unsigned fac(unsigned n)
{
unsigned f;
if(n==0)
f=1;
else
f=fac(n-1)*n;//循环再次进入fac 函数
return f;
}
int main()
{
int a;
cin>>a;
cout<<fac(a)<<endl;
return 0;
}
例3-9
#include<iostream>
using namespace std;
int comm(int n,int k)
{
if(k>n)
return 0;
else if(n==k||k==0)
return 1;
else
return comm(n-1,k)+comm(n-1,k-1);//分好类
}
int main()
{
int n,k;
cout<<"Please enter two integers n and k:";
cin>>n>>k;
cout<<"C(n,k)="<<comm(n,k)<<endl;
return 0;
}
值传递与引用传递
形参写法不同而已
void swap(int a,int b)
void swap (int &a,int &b)
引用声明要初始化,指向存在的对象,初始化后就不能指向其他对象。
内联函数
内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。
节省参数传递,控制转移开销。
inline 只是一个要求,没有inline,在现代编译器中也可能被认为是内联函数。
带默认形参值的函数
由默认值的形参必须在右边。
又默认值的形参右不能出现无默认值的形参。
因为在函数调用时是按从左至右的顺序建立对应关系的。
不能重复定义
第六章:三种方法输出数组元素,二维数组的输出方式
1使用数组名和下标
#include<iostream>
using namespace std;
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
2使用数组名和指针变量
#include<iostream>
using namespace std;
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
for(int i=0;i<10;i++)
cout<<*(a+i)<<" ";
cout<<endl;
return 0;
}
3使用指针变量
#include<iostream>
using namespace std;
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
for(int*p=a;p<(a+10);p++)
cout<<*p<<" ";
cout<<endl;
return 0;
}
二维数组的输出方
#include<iostream>
using namespace std;
int main()
{
int a[3][3]={{11,12,13},{21,22,23},{31,32,32}};
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
cout<<*(*(a+i)+j)<<" ";
cout<<endl;
}
return 0;
}