2021-07-09

C++与数据类型的不同

1.结构的不同
1.1不再使用typedef关键字,结构设计好后定义结构变量不再需要struct关键字
1.2:结构体中的成员可以有函数,结构变量,结构指针使用. ->来访问成员函数。
1.3:C++结构中有一些隐藏的成员函数(构造,析构,拷贝构造,赋值)

例如:定义一个结构体变量

struct Stydent
{
	Student()
	{
		cout << “我是student的构造函数” << endl;
	}//1.3
	char name[20];
	char sex;
	int id;
	int func()
	{
		cout << “我是Student的成员函数” << sex  << endl;//在结构的成员函数中可以直接访问成员变量,不需要使用.或者->
	}//1.2
};
union Data //联合
{
	Data()
	{
		cout << "我是Data的构造函数" << endl;
	}
	char str[5];
	int num;
	void func()
	{
		cout << "我是data的成员函数" << endl;
	}
}
int main(int argc,const char* argv[])
{
	//struct Student stu //这是c
	Student stu //这是C++,不再需要struct变量 1.1
	//stu.sex = 'a';1.2
	//stu.func();1.2
}

2、联合的不同
前3点与结构一样

3、枚举的不同
3.1不再使用typedef关键字,枚举设计好后定义枚举变量不再需要struct关键字
类型检查严格
3.2、是一种独立的数据类型,不能与整形进行隐式转换了

enum  Key{
			Up = 183,
			Down = 184,
			Right = 185,
			Left = 186
};
int main(int argc,const char* argv[])
{
	Key  k = up;
	cout << k <<endl;
}


4、bool类型不同
4.1 C++中有真正的bool类型,bool是C++中的官架子,不再需要包含stdbool.h头文件了
4.2 bool、true、false都是C++中的关键字,而C语言不是
4.3 true false 在C语言中是4个字节,在C++中式1个字节
注意:无论式C还是C++的bool类型变量,只能存储0 1,

5、字符串不同
5.1 C++中的字符串被封装了string类,但可以与C语言的字符串进行转换

例如:

const char* p = "hehe";
string str = "hello";
str = p; // 拷贝 // str+=p 追加
cout << str << endl;

5.2 string类是被封装在string头文件在,但是已经被包含在名字空间中。
5.3 使用string字符串,可以以运算符的方式曹祖,C语言中的string.h系统函数可以继续使用

= strcpy
+= strcat
==strcmp
size() strlen
C++字符串转换成C语言中的类型

struct Student
{
	string name;
	char sex;
	int id;
};
int main(int argc,const char* argv)
{
	Student stu = {"hehe",'w',10086};
	printf("name:%s sex:%c  id: %d",stu.name.c_str(),sti.sex,stu.id)
}

6、void* 不同
在C语言中,void* 可以与任意类型的指针进行转换
而在C++中,void* 不可以自动转换为其它类型的指针,如果要赋值给其它类型的指针,则必须使用强制类型转换,为了提高指针的安全性
其它类型的指针可以直接转换为void类型的指针,C++中之所以保留该功能,是因为C语言标准库、系统接口中采用了大量的void作为函数的参数,如果不保留该功能,C++在调用这些函数时会非常麻烦,因此保留。

例如

int* p - malloc(4) //在C++中这是行不通的  
int* p = (int*) malloc(4)//必须强制类型转换

四、名字空间
1、为什么要使用名字空间
由于C++完全兼容C语言,标准库中自带的大量的类、函数,且支持继承语法,导致全局的标识符大量增加,因此命名冲突的风险也大量增加。

2、什么是名字空间
    C++中设计了一种对命名空间进行逻辑划分成单元的技术就叫做名字空间,它是一种解决命名冲突的机制。
        namespace xxx{
            变量;
            函数;
            结构、联合、枚举;
            类;
        }
        定义的名字空间就形成一个封闭的作用域
 namespace n1{
		int num = 100;
}
namespace n2{
		int num = 100;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
3、如何使用
a、直接导入
using namespace xxx;
这样可以直接使用该名字空间中的所有内容,虽然很方便,但是不推荐这样用

    b、域限定符
        xxx::标识符

4、名字空间合并
    名字空间可以多次定义,不同位置的相同名字的名字空间会自动合并
    a.cpp
    namespace n{
        xxx;
    }
    b.cpp
    namespace n{
        yyy;
    }
    main.cpp
    using namespace n;
    //会把a.cpp中的xxx和b.cpp中的yyy等标识符全部导入到main.cpp中

5、声明和定义可以分开
    a.h
    namespace n1{
        extern int num;
    }
    a.cpp
    int n1::num;
    注意:在定义时需要使用域限定符

在这里插入图片描述
在这里插入图片描述
6、匿名空间
所有的全局标识符都归属于一个名字空间,如果没有指定,则默认属于匿名空间,匿名名字空间中的成员可以通过 ::成员名 来访问
例如:局部变量把同名的全局变量屏蔽后,可以使用 ::变量名 指定使用全局变量

7、名字空间可以嵌套
namespace n1{
int num = 1;
namespace n2{
int num = 2;
namespace n3{
int num = 3;
}
}
}
采用逐层分解的方式使用
n1::n2::n3::num;
也可以导入指定层的名字空间
using namespace n1::n2;n3

在这里插入图片描述

在这里插入图片描述
8、给名字空间取别名
namespace n123 = n1::n2::n3;

在这里插入图片描述
五、 C++的堆内存管理
1、C++中有专门管理堆内存的语句,而C语言只能使用标准库中提供的函数
new 分配内存 相当于C语言中的malloc
delete 释放内存 相当于C语言中的free
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
构造函数相当于申请
析构函数相当于释放

在这里插入图片描述
在这里插入图片描述
4、数组的分配和释放
new 类型[个数] 分配一块连续的多个类型相同的内存,相当于calloc
相当于在堆内存中分配了一个组数,并且会自动调用多次构造函数
delete[] 专门用于释放new []所申请的内存,并且会自动调用多次析构函数
注意:new/delete malloc/free new[]/delete[] 不能混用
5、重复释放
delete可以释放空指针,但别的不能重复释放,这一点与free一致
6、内存分配失败
malloc分配失败返回NULL
new 分配失败会抛出一个异常 std::bad_alloc
7、new和malloc的返回
new 返回一个有类型的指针
malloc 返回一个void*类型的指针

熟练掌握:      malloc/free 与 new/delete 的区别?
    身份:      函数                运算符/关键字  
    返回值:    void*               带类型的指针
    参数:      字符个数(手动计算)   类型(自动计算)
    失败:      NULL                抛异常std::bad_alloc
    构造\析构:  不调用              自动调用
    初始化:    不能初始化           可以初始化为指定的值
    头文件:    包含头文件           直接使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值