c++学习笔记(4.c++中新的关键字)(一)

2014-11-24 02:39:53 · 作者: · 浏览: 2
本节知识点:
1.关键字new与delete:
a.c++中通过new关键字进行动态内存分配,new是一种基于类型进行的内存分配,同时c++使用delete进行内存释放
单个变量内存申请与释放:Type* p = new Type; delete p;
一段内存空间的申请与释放:Type* p = new Type [N]; delete [] p;
示例代码如下:
[cpp]
#include
#include
int main()
{
/*使用new申请单个变量*/
double* p = new double;
*p = 7.2;
printf("%f\n",*p);
delete p;
int *p1 = (int*)malloc(sizeof(int)*10);
for(int i = 0; i < 10; i++)
{
*(p1+i) = i;
}
for(int i = 0; i < 10; i++)
{
printf("%d\n",p1[i]);
}
free(p1);
/*使用new申请一段连续的内存空间*/
//new出来的这个空间看着像数组 但它跟数组有本质区别 这是在堆区的
int *p2 = new int[10];
for(int i = 10; i > 0; i--)
{
p2[10-i] = i;
}
for(int i = 0; i < 10; i++)
{
printf("%d\n",*(p2+i));
}
delete [] p2;
return 0;
}
b.new关键字与malloc函数的区别:
第一:new关键字是c++的一部分,而malloc是由c库提供的函数
第二:new是以具体类型为单位进行内存分配,malloc只能以字节为单位进行内存分配
第三:new在申请单个类型变量时可进行初始化,malloc不具备内存初始化的特性,代码如下:
[cpp]
#include
int main()
{
int* p = new int(6);
printf("%d\n",*p);
double* fp = new double(7.2);
printf("%f\n",*fp);
char* cp = new char('d');
printf("%c\n",*cp);
return 0;
}
2.c++中的命名空间:
a.命名空间产生的原因:在c语言中只有一个全局作用区,所有的全局标识符(包括全局变量、函数)共享同一个全局作用区。尽管有static关键字的限制,但是在工程中依然存在接口函数名之间,或与库函数名冲突的现象。所以c++中提出了命名空间的概念,命名空间将全局作用区分成了若干的命名空间和无名空间(即默认空间,也就是兼容c语言的全局作用区的空间)。
b.命名空间的有效作用域:在c语言中没有命名空间的概念,导致所有在全局作用区的全局标识符的作用域都是,从这个变量或者函数定义声明开始一直有效到程序结束(从始至终贯穿着整个程序,所有很容易就冲突了)。而c++中有了命名空间的概念后,一旦在一个函数中使用using namespace name1; using name1::a;这样的语句的时候,name1这个命名空间的作用域和name1中a变量的作用域,就是从using命令开始到这个函数结束(也就是说可以通过命名空间来控制全局变量的作用域了)。如果是在一个命名空间name2中使用using命令的话,那name1和a的作用域就属于name2了(即与name2属于相同作用域)。如果在默认命名空间(无名空间)中使用using命令,name1和a的作用域就变化与c语言一样的那个全局作用区了。如果使用name1::a这样方法直接去控制变量的话,那作用域就是使用瞬间。
c.命名空间的语法:
定义命名空间(要在函数外面定义):
[cpp]
namespace name2 //这个是命名空间的嵌套
{
int c = 2;
int f = 5;
namespace name3
{
int d = 3;
int e = 4;
}
}
使用命名空间(有三种方式):
第一:using spacename name1; 开启name1这个命名空间,可以使用这个命名空间中的所有变量了。
第二:using name1::a; 可以使用name1命名空间中的a变量了。
第三:name1::a = 10; 直接使用name1命名空间的a变量
第四:::a = 10; 或者 a = 10; 直接使用默认命名空间中的变量
d.使用命名空间要注意:
第一:命名空间是可以相互嵌套的,且有一个嵌套顺序的问题,不同嵌套顺序的命名空间,即使名称相同,也是不同的命名空间。因为using的时候,是有顺序的。
第二:相同名称的命名空间,在using的时候,两个命名空间都会被打开。只要相同名称的命名空间中没有同名变量就可以!否则在使用这个变量的时候,就会出现二义性,编译会出问题。
第三:不同命名空间中,标识符可以同名而不会发生冲突!因为在使用的时候,不一定会同时using这两个命名空间,所以不一定会产生二义性!但是如果同时打开这两个命名空间,还去使用了这个同名变量,编译也会出错,因为产生二义性!但是当using spacename name1;(name1中有变量a) 并且using name2::a的时候,再使用a变量的时候就没有二义性了,编译器默认选择name2中的a变量使用。代码如下:
[cpp]
#include
namespace name1
{
int a = 9;
namespace name1
{
int a = 10;
}
}
namespace name2
{
int p = 19;
int a = 0;
}
int main()
{
using namespace name1;
using name2::a;
printf("%d\n",a);
return 0;
}
3.c++中的强制类型转换:
a.c语言中的强制类型转换:有两种方式,(Type) name 和 Type (name) 注意第二种方式不是很常用。
b.c语言中强制类型转换存在的问题: