第一次写博客 不足地方望指出 小生会不断改进学习争取做到 “好”
初级篇
0.1C语言与C++的不同
0.1.1“实用性”增强
C语言变量都必须在作用域开始的位置定义!
C++更加“使用”所有变量都可以在使用时在定义。
0.1.2变量检测增强
//C语言允许多个重名的全局变量,因为它们指向的是同一块内存区域
//C++则不允许定义多个重名全局变量 不允许这种二义性
0.1.3struct类型增强
C语言不认为struct是新类型
C++则认为struct是新类型
0.1.4C++中所有变量和函数必须要有类型
0.1.5C++中新增bool类型(布尔类型)的关键字
bool只占一个字节
bool类型返回值:
true
false
0.1.6三目运算符功能增强
#include<iostream>
using namespace std;
int main()
{
int a = 30;
int b = 10;
//(a < b ? a : b) = 40;//返回给较小数 并将40返回给它
//cout << "a = " << a << "b = " << b << endl;
int c = (a < b ? a : b);//将小值返回给c
//三目运算符是一个表达式,表达式不能做左值
cout << "c = " << c << endl;
return 0;
}
C语言返回变量的值C++语言返回的是变量本身
C语言返回的是变量值不能作为左值使用 c++中的三目运算符直接返回的是变量本身因此可以出现在程序的任何地方
注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值
使用
(a < b ? 1 : b )= 40;
C语言如何支持类似C++的特性呢?
当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已
0.1.7const
在C++中const对于宏的定义可以直接到函数中,这大大加强了代码的可读性,减少了BUG;
Const与#define的异同
相同:
C++中const修饰的是真正的常量,而不是C中的只读。在这里的const 与#define相同。
不同:
1) 对于宏的定义格式
const int c = 7; #define c 5
2) C++中的const常量与宏定义不同
const常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器处理,单纯的文本替换
C++中的Const常量:
可能分配空间也可能不分配
一般情况下不分配
但是
const被作用于全局当被其他文件使用时会开辟新空间
被取地址是开辟新空间
当const int& a = 10;做引用时会开辟新空间
1.1关键字
1.2命名空间(namespace)
引入空间名关键字namespace,为了更好的控制标识符的作用域
当使用头文件 < iostream >时,该头文件并没有定义全局命名空间,必须使用 namespace std 才能使用cout 和 cin
命名空间的作用:解决命名的冲突
格式:namespace name
{
变量/函数
}
1.2.1 C++命名空间的使用:
使用整个命名空间:using namespace name;
使用命名空间中的变量:using name::variable;
使用默认命名空间中的变量:::variable
默认情况下可以直接使用默 认命名空间中的所有标识符
命名空间可以镶嵌命名空,在同一个工程可以允许多个相同命名空间
namespace N
{
int a = 10 ;
}
int a = 20;
int main()
{
int a = 30;
print(“%d\n”,a);//打印出的是局部变量的a
print(“%d\n”,: :a); //打印出的是全局变量的a
print(“%d\n”,N::a); //打印出的是命名空间N中的a
return 0;
}
namespace的三种选择使用:
直接指定标识符。
如:
print(“%d\n”,: :a); //打印出的是全局变量的a
print(“%d\n”,N::a); //打印出的是命名空间N中的a
2)使用using关键字: using 空间名 :: 变量名
缺陷:不能有相同的变量
namespace N
{
int i = 10;
}
using N::i;
int main()
{
//printf("%d\n", ::i);
printf("%d\n",i);//不能允许其他相同命名的变量
return 0;
}
3)使用 using namespace 空间名
using namespace N;
int main()
{
//printf("%d\n", ::i);
int i = 1; //(冲突已命名空间限定符引用来解决)
printf("%d\n", ::i);
printf("%d\n",i);
return 0;
}
1.2.2C语言与C++命名空间的差异
C中的命名空间
在C语言中只有一个全局作用域
C语言中所有的全局标识符共享同一个作用域
标识符之间可能发生冲突
C++中的命名空间
命名空间将全局作用域分成不同的部分
不同命名空间中的标识符可以同名而不会发生冲突
命名空间可以相互嵌套
全局作用域也叫默认命名空间
1.3C++输入&输出(cout, cin)
使用之前必须要使用:(声明)
#include<iostream>
using namespace std;
输入: cin>>变量;
输出: cout<<a<<endl;
如:
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
//printf("%d\n", ::i);
//printf("%d\n",i);
int a = 0;
cin >> a ;
cout << i <<" "<<a<< endl;
return 0;
}
1.4缺省数参
缺省参数的使用方式
没有参数则使用默认
有则使用传的参数‘’
如下代码中有全缺省参数和半缺省数
void Test(int a = 1 ,int b = 1, int c = 1)//全缺省参数
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
//void Test1(int a, int b = 1, int c)//错误的示范,最右边必须带值
void Test1(int a , int b = 1, int c = 1)//半缺省参数,从右往左看必须
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
int main()
{
Test(12, 13, 14);
Test(14);
Test();
Test1(12, 13, 14);
Test1(14);
//Test1();//若为半缺省参数 缺省的参数必须传值
//printf("%d\n", ::i);
//printf("%d\n",i);
//int a = 0;
//cin >> a ;
//cout << i <<" "<<a<< endl;
return 0;
}
int add( int a, int = 0)占位参数 实际作用仅仅是为了占位
{
return 0;
}
- 半缺省参数必须从右往左依次来给出,不能间隔着给
- 缺省参数不能在函数声明和定义中同时出现
//void Test(int a = 1, int b = 1, int c = 1);// 缺省参数不能在函数声明和定义中同时出现>>>一般放在
//声明中指出
void Test(int a = 1 ,int b = 1, int c = 1)//全缺省参数
注意:
- 半缺省参数必须从右往左依次来给出,不能间隔着给
- 缺省参数不能在函数声明和定义中同时出现
- 缺省值必须是常量或者全局变量
- C语言不支持(编译器不支持)
1.5函数重载
1.5.1函数重载概念
C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的 形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题(编译器会根据参数类型进行辨别然后进行编译)编译器编译阶段进推演 传的参数若没有此类型编译器就会隐式转换
namespace ADD
{
int add(int lift, int right)//重载的时候注意函数类型(函数参数列表)应不同
//返回值并不是构成函数重载的原因
//函数重载不要使用默认参数
{
int sum = lift + right;
cout << sum << endl;
return 0;
}
double add(double lift, double right)
{
double sum = lift + right;
cout << sum << endl;
return 0;
}
char add(char lift, char right)
{
char sum = lift + right;
cout << sum << endl;
return 0;
}
}
using namespace ADD;
int main()
{
add(10, 20);
add(10.2, 10.4);//参数类型一定要给正确
add('1', '2');
//add(‘1’,10);//错误
return 0;
}
函数的重载与函数返回值是否相同没有关系
单参函数和无参函数最好不要一起出现
1.5.2名字修饰
这个很重要:
这里需要注意的是因为编译器在底层对函数进行编译的时候实际将函数名进行重新修饰,使之成为一个比较复杂的名字。这个名字中包含了:函数名以及参数类型。这就是为什么函数的重载要求其参数列表不同,只有参数列表不同的情况下编译器在进行重新修饰后,才能保证这个名字在底层的全局唯一性。