cout、cin、endl
cout是标准输出流对象,<<是输出操作符;cin是标准输入流对象,>>是输入操作符;endl是换行符操作符。他们都属于C++标准库,所以都在std的名字空间里。
在写C++程序时,一般会加上using namespace std,这是为什么呢?
首先,先了解下关键字namespace:
namespace:
namespace,即名字空间,C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。名字空间除了系统定义的名字空间之外,还可以自己定义,定义名字空间用关键字“namespace”,使用名字空间时用符号“::”指定。不指定名字空间的变量或函数都是当前名字空间下的变量或函数。不定义名字空间的情况下,都属于全局名字空间。
namespace name1
{
int a = 10;
}
namespace name2
{
int a = 20;
}
int a = 3;
int main()
{
std::cout << name1::a << std::endl;//10
std::cout << name2::a << std::endl;//20
std::cout <<a << std::endl;//3
system("pause");
return 0;
}
标准C++库中的所有组件都是在一个被称为std的名字空间中声明和定义的。在采用标准C++的平台上使用标准C++库中的组件,只要写一个using指示符:using namespace std;就可以直接使用标准C++库中的所有成员。 或者 std::成员 的方式也可以使用C++库里的成员。
::是作用域解析符。
#include<iostream>
int main()
{
cout << "hello world" << endl;//必须加上using namespace std;
std::cout << "hello world" <<std:: endl;//如果没有用using namespace std
}
总结namespace:
用法:名字::或者using namespace std;
作用:解决命名冲突。
一般会使用using namespace std,当冲突时再区别名字空间域(名字::)。
cout、cin自动识别类型
#include<iostream>
using namespace std;
int main()
{
int i = 0;
cin >> i;//scanf("%d", &i);
cout << i << endl;//printf("%d\n",i);
cout << "hello world" << "\n";//printf("%s\n", "hello world");
system("pause");
return 0;
}
函数重载
//func.h
#include<stdio.h>
void func(int i);//函数声明
//func.c
#include"func.h"
void func(int i)
{
printf("%d\n", i);
}
//test.c
#include"func.h"
#include<stdlib.h>
int main()
{
func(10);
system("pause");
return 0;
}
如果将func.c的func函数注释掉,将会出现一种链接错误:
为什么会出现这种错误呢?首先了解程序的编译过程:
所谓链接错误是有声明,没有定义。当把func.c的func函数注释掉,main函数无法找到func的地址,就出现了链接错误。(有声明,没有定义编译可以通过)
C++支持函数重载,而C不支持函数重载:
函数重载是指在同一作用域内,一组函数的函数名相同,参数列表不同(类型或者个数不同,返回值可同可不同)。
C++支持函数重载:
C不支持函数重载:
那为什么C++支持函数重载,而C不支持函数重载?
C++在链接时:C++符号表是函数名修饰规则:第一个void func(int i, char c),符号表是_Z4funcic(函数地址),第二个void func(char c, int i),符号表是_Z4funcci(函数地址)(_Z4funcic中4代表函数名字符个数,i是int型,c是字符型),C++在链接时将两个函数区别开,就可链接成功。
而c在连接时认是func(函数地址),即无法区分两个func函数,链接错误。
缺省函数
//全缺省,即全部参数给缺省参数
int func1(int a = 2, int b = 3)
{
return a + b;
}
//半缺省,缺省必须连续
//int func3(int a=2,int b,int c=3) 错误,没有连续
int func2(int a, int b=3)
{
return a + b;
}
int main()
{
printf("%d\n",func1(3)); //6 将3传给a
printf("%d\n", func1()); //5 没有传参则用缺省参数值
printf("%d\n", func1(4,5)); //9 //给定实参值则用实参值
printf("%d\n", func2(2)); // 5
printf("%d\n", func2(2,6));// 8
//printf("%d\n", func2()); 错误,半缺省必须将缺省参数左边参数进行传参
system("pause");
return 0;
}