C++中的hello world
using namespace std;
命名空间
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的
在stdlib中有一个rand函数,如果我们定义一个全局变量也叫rand就会报错,命名冲突
namespace swr
{
int rand=0;
}
这个称为命名空间域,有了命名空间域,rand依旧是全局变量,属于swr的命名空间,生命周期在全局
int a=0;
int main()
{
int a=1;
printf("%d\n",a);//局部优先,就近
printf("%d\n",::a);//指定去域作用的范围
return 0;
编译器默认先在局部找,局部找不到去全局找,你告诉编译器去命名空间,就只去命名空间
命名空间可以嵌套,多个文件可以用一个命名空间,编译器会帮我们合成。
如果不是为了做项目,而是做测试,可以定义一个新的命名空间,然后和以前的也不会冲突。
如果每次使用命名空间的变量,函数都要指定,很麻烦,所以使用using namespace ,这样编译器会帮助我们去全局找,全局找不到就去命名空间域找
要用cout就要包含头文件iostream,cout是ostream类型的对象,<<是运算符,流插入
hello流入cout,c代表控制台,cout<<“hello”<<endl; C++自动识别类型
部分展开:using std::cout; using std::endl;
标准库都属于std这个命名空间
所以有三种方式,指定,展开,部分展开
namespace swr
{
struct TreeNode
{
struct TreeNode* left;
struct TreeNode* right;
int val;
};
}
int main()
{
struct swr::TreeNode node;
return 0;
}
//可以嵌套
namespace sql
{
int a = 0;
namespace swr
{
int rand = 0;
void func()
{
printf("func()\n");
}
struct TreeNode
{
struct TreeNode* left;
struct TreeNode* right;
int val;
};
}
}
int main()
{
printf("%p\n", sql::swr::rand);
sql::swr::func();
struct sql::swr::TreeNode node;
return 0;
}
cin是一个全局的istream类型的对象,cout是一个全局的ostream类型的对象,
>>流提取,从控制台中提取放到 i 和 d 两个变量中,cin>>i>>d
cout<<i<<d把 i和d插入到cout,把 i和d插入到cout
cout<<“hello” <<endl 插入一个const char类型的字符数组
cin cout可以自动识别类型,而printf,scanf需要显示写%d,%lf…
但是如果需要控制打印宽度,浮点数精度最好使用printf
缺省参数
当没有实参时,缺省起作用
没有给缺省参数的要从左往右传实参
给缺省参数的要从右往左传参,不能有间隔
缺省参数不可以在声明和定义的位置同时出现,以声明为准
缺省参数的应用
写一个数据结构的栈,默认按照capacity的缺省参数开空间,如果我知道要开多少空间可以显示传实参(100)提前开好空间
函数重载
一个函数, C不允许同一作用域同名函数的存在,在C++中允许在同一作用域,必须是一个命名空间,允许同名函数
形参列表必须不同,1.参数类型 2.个数 3.顺序 但返回值不同无法构成函数重载
C++的流可以自动识别类型,本质就是函数重载,cout是一个ostream类型的对象,
调用operator <<(int val)
调用operator <<(double val)
引用
引用就是给变量起别名,不会额外占用空间
1.引用必须在定义时初始化
2.一个变量可以多个引用
3.一个变量一旦引用一个实体不可以引用其他实体
引用的应用场景
// 1、做参数 – a、输出型参数 b、大对象传参,提高效率
// 2、做返回值 – 输出型返回对象,调用者可以修改返回对象,减少拷贝,提高效率
传引用返回,不能随意传临时变量的引用,结果是未定义的,系统会清理函数栈帧,此时要用传值返回
传引用返回的实例时传静态变量