c++基础1----------------基于c的扩展

1;头文件问题
#include “iostream”//首先iostream与iostream.h的区别

iostream.h是早期c++对c的扩展还是使用的全局空间,已经不用了
iostream是后期没有定义全局空间的,因此要使用cout,cin这些标准需要using namespace std才行
c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。

2;命名空间

在c语言中就只有一个全局区,因此也就导致了一个用c实现的项目的不同文件中设置的全局变量不能定义为相同名称。
在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,
标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。
#include "iostream"//首先iostream与iostream.h的区别
/*
	iostream.h是早期c++对c的扩展还是使用的全局空间,已经不用了
	iostream是后期没有定义全局空间的,因此要使用cout,cin这些标准需要using namespace std才行
	c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。
	*/

//using namespace std;//使用命名空间,命名空间就是定义了一些
//如果不using std则cout需要std::cout才能使用
/*
	标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。
*/

//定义空间
namespace std_a
{
	int a = 10;
}
namespace std_b
{
	int a = 100;
	namespace std_c
	{
		int c = 20;
	}
}

int main()
{
	//使用
	//using namespace std_a;
	//using namespace std_b::std_c;//只定义了b空间中的空间c
	using namespace std_b;//而没有定义空间c
	using namespace std_b::std_c;
	/*
	因为使用了using namespace std,因此我们使用cin,cout这些标识符的时候就不用带上命名空间名字
	如std:cin   std:cout
	*/
	std::cout << a << std::endl;//如果不using std_a或者b则报错没有定义a,如果ab都using则报错不明确,
	std::cout << c << std::endl;

	system("pause");
	return 0;
}

3;变量检测增强
在C语言中,重复定义多个同名的全局变量是合法的
在C++中,不允许定义多个同名的全局变量
C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上
int g_var;
int g_var = 1;重定义
C++直接拒绝这种二义性的做法。

4; struct类型加强
struct stu
{
int age;
char name[200];
};
在c++中可以直接使用stu s1;这样来定义变量,而在c中则需要添加上struct stu s1这样才能定义变量。

5;C++中所有的变量和函数都必须有类型
在C语言中
int f( );表示返回值为int,接受任意参数的函数
int f(void);表示返回值为int的无参函数
在C++中
int f( );和int f(void)具有相同的意义,都表示返回值为int的无参函数
C++更加强调类型,任意的程序元素都必须显示指明类型

6;新增Bool类型关键字
只占一个字节,
bool转为其他;ture1,false0,
其他转为bool;非0为真,0为假

7;三目运算符功能增强
1)C语言返回变量的值 C++语言是返回变量本身
C语言中的三目运算符返回的是变量值,不能作为左值使用
C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方
2)注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
(a < b ? 1 : b )= 30;
3)如何实现
*(a<b?&a:&b) c++在内部这样完成的。

8;const在c++中才是真正的变量,本质就是符号表
1)当一个变量定义为一个const类型的变量时,编译器就会在符号表中表示,并且是不会分配内存的,当编译期间发现有代码在取地址或extern时则会创建一个内存将符号表的那个值放入,但是这个地址与const变量除开值一样并没有什么关联。

C语言中的const变量
C语言中const变量是只读变量,有自己的存储空间,可以通过指针进行修改
C++中的const常量
可能分配存储空间,也可能不分配存储空间  
当const常量为全局,并且需要在其它文件中使用,会分配存储空间
当使用&操作符,取const常量的地址时,会分配存储空间
当const int &a = 10; const修饰引用时,也会分配存储空间

2) const和#define相同与不同之处
相同的是 const在编译期间确定为常量,#define宏在预处理时,但是都可以作为数组的下标进行定义
不同的是作用域不同,const有作用域,而宏是全局的

#include "iostream"

using namespace std;

#define N  10

void f1()
{
#define N1 1
	const int a1 = 10;

}
int main()
{
	const int a = 10;
	const int b = 5;
	//const int c;//必须初始化
	int arr[a + b];//是可以运行的,则说明ab在编译期间就完成了,是常量
	int arrb[N];
	//cout << a1 << endl;const修饰的是有作用域的,因此在main中是不能用a1;
	cout << N1 << endl;//是可以的,#define的作用域是全局,除开是有udefine取消 #undef a  # undef
	system("pause");
	return 0;
}

9;C++中引用
1)概念;
变量的本质就是一段连续的存储内存空间的别名,是一个标号。
而引用就是一个已定义变量的别名,那么就是等效于变量不可变,但空间的值可变
int b = 10;
int & a = b;//a就是引用对已定义变量b的别名
应用在内部实现就是 Type& name -》 Type* const name一个常指针,因此占用大小就是4个字节。
2)用法
《1》普通引用在声明时必须用其它的变量进行初始化,
《2》 引用作为函数参数声明时不进行初始化
《3》函数返回值是引用,只有引用静态变量或全局变量的时候才有用,才可以继续做左值或右值
引用是否乱码就看所令的别名的空间是不是已经释放。
《4》指针引用,与二重指针类似只是函数传参的时候不需要传其地址
《5》常量引用const修饰引用,const引用让变量(所指内存空间)拥有只读属性

10;C++对C的函数扩展
1)c++内联函数
内联函数由 编译器处理,直接将编译后的函数体插入调用的地方,有参数的检查,但省略了压栈,跳转的开销。
宏代码片段 由预处理器处理, 进行简单的文本替换,没有任何编译过程。
但是inline只是一种请求,编译器不一定允许这种请求,并且内联函数有很多限制。

2)默认参数
C++中可以在函数声明时为参数提供一个默认值,当函数调用时没有指定这个参数的值,编译器会自动用默认值代替。
但是默认参数有些要求;如果默认参数出现,那么右边的都必须有默认参数
void printABC(int a, int b, int x = 3, int y=4, int z = 5)

3)函数占位参数
占位参数只有参数类型声明,而没有参数名声明,一般情况下,在函数体内部无法使用占位参数
int func(int a, int b, int ) 函数调用是需要传3个参数才行
占位参数和默认参数一起使用int func2(int a, int b, int = 0),则func2(1, 2); func2(1, 2, 3);都能调用。一种扩展。

4)函数重载
用同一个函数名定义不同的函数,当函数名和不同的参数搭配时函数的含义不同、
函数返回值不能作为函数重载的依据
函数重载是由函数名和参数列表决定的。

函数重载的一些情况
函数重载遇上函数默认参数,不行存在二义性
函数重载和函数指针结合,会选择调用与函数指针指向类型匹配的那个函数进行调用。

猜你喜欢

转载自blog.csdn.net/zw1996/article/details/84780971