**
C++
**
1,解释型语言和编译型语言
解释型语言:语法固定,用来做测试
编译型语言:更加随心所欲(c c++)
c: 面向过程的语言:一旦出现了问题就没有办法向下执行
c++: 面向对象的语言:一个项目由多个对象组成,一个对象出现问题,其他的对象可以执行,效率最高
c与c++的区别:
c :面向过程 c++:面向对象
2,c++基于c语言有如下方面的增强:
更加严格的类型检查
int main()
{
int *p=0x1234567;
return 0;
}
在c语言编译:警告warning
在c++语言中:错误error
新增变量引用
支持面向对象
类和对象,继承,多态,虚函数及RTTI(运行时类型识别)
增加泛型编程(template),标准模板库(STL)
支持异常处理
支持函数及运算符重载
支持命名空间
用于管理函数名,变量及类
3,c++编译过程
g++ -s 文件名:生成汇编语言
预处理-----》编译-----》汇编------》链接
预处理:g++ -E 1.cpp -o 1.i 展开头文件,替换宏定义
编译: g++ -S 1.i -o 1.s 检查是否有语法错误(将原文件编译成汇编文件)
汇编: g++ -c 1.s -o 1.o 通过汇编文件转换成二进制的目标文件
链接 g++ 1.o 将二进制的目标文件链接成可执行的文件(程序)
4,c++ 融合了三种编程方法
{
1,c语言的面向过程编程
2,c++基于c语言扩展的面向对象编程
3, c++模板支持的泛型编程
}
5.常变量
在c++中const变量必须初始化
const int i;//error
const int i=0;
int main()
{
/*c++中const变量必须初始化*/
//const 定义的变量直接成寄存器去取,导致改变没有成功,需要防止优化
volatile const i=0; //加上上volatile之后i=100,p=100
//const int i=0; //不加volatile i=0,p=100
//const int i;//error
cout <<"i="<<i<< endl;
int *p=(int *)&i;
cout << "p=" << p << ",,&i=" << (int*) &i << endl;//p和&i的地址相同
*p=100;
cout << "i="<< i<< ",*p=" << *p<< endl;
}
8.强制转换
c语言强制类型转换的一般形式:(类型名) (表达式)
(double)a
c++ 还增加了以下形式:类型名(表达式)
int (x) int(x+y)
int main()
{
double a=5.5;
int b;
b=(int)a+int(a);//10
cout<<b<<endl:
b=int(a+b)
cout<<b<<endl;//15
}
9.引用 ------------------------------>最常用的是在传参数中
对于一个变量可以使用引用,不是常量
引用是一种新的变量类型,作用:对变量取别名
int a=5;
int &b=a;//给a变量取别名b,b的类型:int&
引用的作用范围:通常作为函数穿参使用,可以尽量减少指针的使用,还可以提升效率
eg :
int main())
{
int a=5;
//int &b; //error
int &b=a;//引用变量必须初始化,表明是给谁取别名
cout <<"a="<<a<<",b="<<b<<endl;//b=a=5
cout <<"&a="<<&a<<",&b="<<&b<<endl;//a和b地址一样
b=100;
cout<<"a="<<a<<",b="<<b<<endl;//b=a=100
cout<<"&a="<<&a<<",&b=”<<&b<<endl;//a和b地址一样
int c=10;
b=c;//把c的值赋给变量b
cout <<"a="<<a<<",b="<<b<<endl;//b=a=10
cout<<"&a="<<&a<<",&b="<<&b<<endl'//a和b地址一样
}
eg:
void swap(int &m,int &n)//m=a,n=b
{
int t;
t=m;
m=n;
n=t;
}
int main()
{
int a=5;
int b=39;
swap(a,b);
cout << "a=“<<a<<endl;
cout <<"b="<<b<<endl;
}
10.内联函数inline
是一种提高效率的方法
即在编译时将所调用函数的代码直接嵌入到主调函数中。这种嵌入到主调函数中的函数称为内嵌函数(inline function)
内联函数语法
inline 存储类型 数据类型 函数名(参数列表)
注意:
1.内联函数可以提高运行速度,但是会增加代码的长度
2,因为多个文件是分开编译的,所以需要把内联函数的声明及定义放在头文件中
3,需要频繁使用的函数才会用到内联函数
eg:
inline void function()
{
int a =100;
}
int main(int argc,char *argv[])
{
int i;
for(i=0;i<10000000;i++)
{
function();
}
return 0;
}
//time ./out ------------------->查看花费的时间
11,函数的重载
c中不可以函数的重载
函数的重载:
同一函数名可以有多个函数的定义,这些函数通过参数来区别
要求函数的参数不同,参数的个数及类型,与返回值无关
int add( int a);
double add(int a);//error,重载函数与函数名及参数有关,与返回值无关,有歧义
int add (int a,int b);
int add(int a,int b,int v);
函数重载是否会产生歧义?
由函数调用时满足传参的函数个数决定,如果只有一个函数满足条件就不会产生歧义,否则会产生
int add(int a)
{
return (a+a);
}
int add (int &a)
{
return (a+a);
}
int main()
{
cout <<add(5)<<endl;
int a=10;
//cout <<add(a)<<endl;//error 歧义
return 0;
}
12,函数的默认参数值
c++允许赋予函数默认参数
函数的默认参数:
- 在定义或声明函数时,可以给函数参数设置默认值
- 当函数调用时,被设置了默认参数可以传参数也可以不传参数
- 当没有给默认参数值的参数传参时,那么给参数的值就是设定默认参数的值,而如果给有默认参数的参数传参时,那么该参数的值就是传过去的参数。
注意:
1,当在函数定义时设置默认参数时,函数的定义需要放在main的前面
2,默认参数值从后往前设置,一旦某一个参数有默认参数值,后面的所有参数都必须有默认值
int add(int a=1,int b,int c=10)//error
int add (int a,int b=2.int c=10)
cout<<add(2)<<endl;
3.当重载与默认的参数值相连接,容易参数歧义
int add(int a=5)
{
return (a+a);
}
int add(int a,int b=100)
{
return (a+a)
}
int man()
{
cout<<add(5)<<endl;//歧义
cout<<add(5,9)<<endl;
cout <<add()<<endl;//add(in a=5)
}
12.结构体
1,在c++中可以直接用结构体名作为结构体类型
struct STU{
int a;
};
STU stu;
stu.a=10;
STU *p=&stu;
p->a;
2,结构体中可以直接添加成员函数,访问方式与成员变量一样
struct STU{
int fun{
}
int a;
};
重点:c与c++中struct有什么不同
c中的struct不可以含有成员函数,而c++中可以。可以直接用结构体名作为结构体类型。
c++中struct和class的主要区别在与默认的存取权限不同,struct默认为public,而class默认为private