1.c++头文件不必是.h结尾,c语言中的标准库头文件如math.h,stdio.h在c++中命名为cmath,cstdio
#include <cmath>
#include <cstdio>
int main(){
double a-1.2;
a = sin(a);
printf("%lf\n",a);
}
2.命名空间namespace
为防止名字冲突,c++引入了名字空间(namespace),通过::运算符限定某个名字属于哪个命名空间
//如 “电气1802”::“张三”
//如 “通信1910”::“张三”
#include<cstdio>
namespace first
{
int a;
void f(){
}
int g(){
}
}
namespace second
{
double a;
double f(){
}
char g;
}
int main()
{
first::a = 2;
second::a =6.453;
first::a = first::g()+second::f();
printf("&d\n",first::a);
printf("%lf\n",second::a);
return 0;
}
通常有3种方法使用名字空间X的名字name:
using namespace X;//引用整个命名空间
using X::name; //使用单个名字
X::name; //程序中加上名字空间前缀,如X::
3.C++的新输入输出流库(头文件iostream)将输入输出看成一个流,并用输出运算符<<和输入运算符>>对数据(变量和常量进行输入输出);
其中有cout和cin分别代表标准输出流对象(屏幕窗口)和标准输入流对象(键盘);
标准库中的名字都属于标准名字空间std
#include<iostream>
using std::cout;//使用单个名字
int main(){
double a;
cout<<"从键盘输入一个数"<<std::endl; //endl表示换行符,并强制输出
std::cin>>a; //通过“名字限定”std::cin
//cin是代表键盘的输入流对象,>>等待键盘输入一个实数
a=sin(a);
cout<<a; //cout是代表屏幕窗口的输出流对象
return 0;
}
#include<iostream> //标准输入输出头文件
#include<cmath>
using namespace std;//引入整个命名空间std中的所有名字 //cout cin 都属于名字空间std
int main(){
double a;
cout<<"从键盘输入一个数"<<endl;
cin>>a;
a = sin(a);
cout<<a;
return 0;
}
4.变量“即用即定义”在函数内定义,且可以表达式初始化
doubel a=12*3.12;
5.程序块{}内部作用域可定义域外部作用域同名的变量,在该块里就隐藏了外部变量
#include<iostream>
using namespace std;
int main(){
double a;
cout<<"Type a number:";
cin>>a;
{
int a=1;//int a隐藏了外部作用域的double a
a=a*10+4;
cout<<"Local number:"<<a<<endl;
}
cout<<"You typed:"<<a<<endl;//main作用域的“double a”
return 0;
}
6. for循环语句可以定义局部变量
int main(){
int i=0;
for(int i=0;i<4;i++){
//在for内定义局部变量,不影响for外部的变量
cout<<i<<endl;
}
cout<<"i contains:"<<i<<endl;
}
7.访问和内部作用域变量同名的全局变量,要用全局作用域限定::
#include<iostream>
using namespace std;
double a = 128;
int main(){
double a=256;
cout<<"Local a:"<<a<<endl; //输出函数内部局部变量
cout<<"Global a:"<<::a<<endl; //::是全局作用域限定
return 0;
}
8.C++引用了“引用类型&”,即一个变量是另一个变量的别名
#include<iostream>
using namespace std;
int main(){
double a = 3.1415927;
double &b = a; //b是a的别名,b就是a
b = 89; //也就是a的内存块值为89
cout<<"a contains:"<<a<<endl; //最终输出 89
return 0;
}
引用经常作为函数的形参,表示形参和实参的实际上是同一个对象,在函数中对形参的修改就是对实参的修改
引用举例:函数直接引用参数进行内存修改
#include<iostream>
using namespace std;
//xy是实参的引用
void swap(int &x,int &y){
cout<<"swap函数内交换前:"<<x<<""<<y<<endl;
int t=x;x=y;y=t; //在函数里已经进行了修改
cout<<"swap函数内交换后:"<<x<<""<<y<<endl;
}
int main(){
int a=3,b=4;
swap(a,b); //xy将分别是ab的引用,即x就是a,y就是b
cout<<a<<","<<b<<endl; //显示100,4
return 0;
}
指针举例对比:参数传内存地址去函数修改
#include<iostream>
using namespace std;
void swap(int *x,int *y){
cout<<"swap函数内交换前:"<<x<<""<<y<<endl;
int t=x;x=y;y=t;
cout<<"swap函数内交换后:"<<x<<""<<y<<endl;
}
int main(){
int a=3,b=4;
swap(&a,&b); //&a赋值给x,&b赋值给y
//xy分别是int*指针,指向ab
//*x,*y就是a和b
cout<<a<<","<<b<<endl; //显示100,4
return 0;
}
当实参占据内存大时,用引用代替传值(需要复制)可提高效率,
如果不希望因此无意中修改实参,可以用const修改符。如:
void change(double &x,const double &y,double z){
x=100; //引用了x,内存会进行修改
y=200; //内存的值并没有修改,因为const
z=300; //不是引用,也不会修改
}
int main(){
double a,b,c;//内在类型变量未提供初始化,默认值为0;
change(a,b,c);
cout<<a<<b<<c<<endl; //100 0 0
return 0;
}
9.对于不包含循环的简单函数,建议用inline关键字声明,为“inline内联函数”,编译器将内联函数调用用其代码展开,称为“内联展开”,避免函数调用开销,提高程序执行效率
(一般很多编译器会自动将函数内联优化)
inline double distance(double a,double b){
return sqrt(a*a+b*b);
}
int main(){
double k=6,m=9;
//下面两行将产生同样的代码
cout<<distance(k,m)<<endl;
cout<<