从c到c++(1)
1:c++头文件不必是.h结尾
2.c++可以使用namespace命名空间
namespace first{
int a;
}
namespace second{
double a;
}
int main(){
first::a = 2;
second::a = 3.14159;
}
通常有3种方法使用命名空间X的名字name
using namespace X; //引入整个命名空间
using X::name // 使用单个名字
X::name // 程序中加上名字空间前缀
3.c++新的输入输出流库(头文件iostream)
c++将输入输出看成一个流,并用输出运算符<<和输入运算符>>对数据(变量和常量进行输入输出)
其中有cout和cin分别代表标准输出流对象(屏幕窗口)和标准输入流对象(键盘)
标准库中的名字都属于标准名字空间std
#include <iostream>
using std::cout;
int main(){
double a;
cout << "从键盘输入一个数" << std::endl; // endl表示换行符
std::cin >> a; // 等待键盘输入一个double
cout << a; // 原样输出
}
4.访问和内部作用域变量同名的全局变量,要用全局作用域限定
#include <iostream>
using namespace std;
double a = 128;
int main(){
double a = 256;
cout << a << std::endl; // 直接访问内部作用域变量
cout << ::a << std::endl; // 访问外部作用域同名变量
}
5.C++引入了“引用类型”,即一个变量是另一个变量的别名
#include <iostream>
using namespace std;
int main(){
double a = 3.14159;
// 这里b是引用类型,属于a的引用
double &b = a;
b = 89;
cout << a; // 89
}
当实参栈内存大时,用引用代替传值可提高效率
6.对于不包含循环的简单函数,建议用inline关键字声明为内联函数
编译器将内联函数调用代码展开,称为"内联展开",避免函数调用开销
7.通过try-catch处理异常情况
正常代码放在try块,catch中捕获try块抛出的异常
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int numa;
cin >> numa;
int numb = 1;
try{
if(numa == 0){
throw 0;
}
cout << numa / numb;
}catch(int result){
cout << "a is " << result;
}
}
8.c++函数支持默认参数和函数重载
9.结构体的运算符重载(一种特殊的函数重载)
#include <iostream>
#include <cmath>
using namespace std;
struct Person{
int age;
};
// 结构体加号运算符重载
Person operator+ (Person p1, Person p2){
Person newp;
newp.age = p1.age + p2.age;
return newp;
}
int main(){
Person p1, p2, p3;
p1.age = 10;
p2.age = 15;
// 运算符重载 实现结构体的运算
p3 = p1 + p2;
cout << p3.age;
}
10.模板函数,普适性的函数
#include <iostream>
#include <cmath>
using namespace std;
// 可以对任何能比较大小的的类型使用该模板让编译器自动生成针对该数据类型的具体函数
template<class T>
// 避免为int、double、char...每种类型都定义一个求最小值的函数
T minValue(T a, T b){
if(a < b){
return a;
}
return b;
}
int main(){
int a = 3, b = 4;
cout << minValue(a, b);
}
11.动态内存分配。关键词new和delete比c的malloc/alloc/realloc/free更好。可以对类对象调用初始化构造函数或销毁析构函数
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int a = 1;
int *b = &a;
cout << &a << endl;
cout << b << endl;
// 分类新的堆存储空间 给b
b = new int;
cout << &a << endl;
cout << b << endl;
// 释放b指向的内存块
delete b;
}