C++与C的区别(2)

C++与C的区别

新基本数据类型

bool类型

  • 占用内存是1个字节
  • 打印出来的值是: 0或者1 非零值表示成立
  • 通常用的是false和true做初始化
  • 用途:
    1. 做开关
    2. 做标记–>查找类的操作
    3. 做函数返回值
#include<iostream>
using namespace std;

int main()
{
	bool bnum = 5;
	cout << bnum << endl;
	//一般是会用都用关键字初始化
	bnum = false;    //0
	cout << bnum << endl;
	bnum = true;    //1
	cout << bnum << endl;
	return 0;
}

引用类型

可以把引用类型理解为一个起别名的用法

  • 左值引用
    • 当做函数参数: 直接修改实参,防止拷贝本产生
    • 当做返回值: 增加左值使用
    • const属性限定问题
#include<iostream>
using namespace std;

void num(int& a)//做函数参数,直接修改实参
{
	a = 100;
}

int _num = 1;
int& num_1()	//当做返回值: 增加左值使用
{
	return _num;
}
int num_2()	
{
	return _num;
}

void printfNum(const int& num)//const属性限定
{
	//num++;  //常引用不能做++
	cout << num << endl;
}

int main()
{

	int a=1;
	int& a1=a;
	cout << a1 << endl;

	int b = 1;
	num(b);
	cout << b << endl;

	num_1() = 101;//返回一个变量,可以充当运算符左值
	//num_2() = 1003;  错误,返回是一个值,不是一个变量,不能充当运算符左值
	cout << _num << endl;

	printfNum(102);

	return 0;
}
  • 右值引用
    • 给右值起别名
    • 当做函数参数: 函数只能传入右值
      • 想要传入左值,使用move函数移动
#include<iostream>
using namespace std;

void printfNum(int&& num)  //只能传入右值
{
	num++;					//提供修改接口
	cout << num << endl;
}

int main()
{
	//右值引用 &&  --->提供修改接口
	int&& num = 1;
	num = 100;
	cout << num << endl;

	printfNum(100);

	//将左值变成右值
	int num_1 = 101;
	int&& num_2 = move(num_1);       //移动函数:把左值变成右值
	printfNum(move(num_2));
	printfNum(move(num_1));

	return 0;
}

C++结构体类型

  • 类型名不再需要struct关键字了
  • C++结构体可以给成员直接赋初始值
  • C++结构体可以包含函数
    • 在结构体中声明,在结构体外实现,也可以直接在结构体中实现
    • 结构体中函数访问数据,是可以直接访问
    • 学会调用,和访问数据成员时的方式一样
      • 对象(结构体变量).成员
      • 对象指针->成员
    • (*对象指针).成员
  • 其实C++结构体的处理就是按照类的方式处理(后续会讲到)
    • 用了构造函数时候C++结构体和C语言结构体处理方案是完全不同的
#include <iostream>
using namespace std;

//描述的是事物特征和行为
struct MM
{
	char name[20] = "MM";
	int age = 111;
	int num = 1001;
	void initData(const char* str, int age, int num);		//在结构体声明
	void printData()
	{
		cout << name << "\t" << age << "\t" << num << endl;
	}
};

//在外面实现,必须要加结构体名限定  MM::
void MM::initData(const char* str, int age, int num)
{
	strcpy_s(name, 20, str);
	//同名问题,对其作用域限定
	MM::age = age;
	MM::num = num;
}
int main()
{

	//类型可以不需要struct
	MM mm;
	mm.printData();
	cout << mm.name << "\t" << mm.age << "\t" << mm.num << endl << endl;

	MM mm2 = { "mm2",18,1030 };
	mm2.printData();
	cout << mm2.name << "\t" << mm2.age << "\t" << mm2.num << endl << endl;

	mm2.initData("小芳", 18, 1004);
	mm2.printData();
	return 0;
}

C++枚举类型

  • C++的枚举类型不能当做一个简单的int类型
  • 访问必须要用枚举类型名限定
#include <iostream>
using namespace std;

enum State {Open,Close};
enum class Color
{
	Red,
	Blue
};
void print(int state)
{
	cout << state << endl;
}
void printEnum(Color color) 
{
	//cout << color << endl;  不能直接打印
}
void testEnum() 
{
	print(1);
	print(Open);
	//print(Color::Red);  //访问必须要用枚举类型名限定
	printEnum(Color::Red);
}
int main() 
{
	testEnum() 
	return 0;
}

C++string类型

C++string本身是一个类,所以大家本节课只要学会使用即可,不需要问问什么

  • 头文件: #include
    • 注意点和cstring区别,cstring是C语言头文件
  • 没有用using namespace std ; string类型需要改为std::string
  • 掌握string常用方式
    • 创建方式
    • 基本操作(比较,连接)
    • 转C语言char*

微软帮助文档:basic_string 类 | Microsoft Docs

int a = (int)1.3;		//C语言强制类型转换
int b = int(1.34);		//C++强制类型转换

#include <iostream>
#include <string>
	using namespace std;
int main()
{
	//std::string str;
	//No.1创建
	//1
	string str1;
	str1 = "ILoveyou";
	cout << str1 << endl;
	//2
	string str2 = "helloWord";
	cout << str2 << endl;
	//3
	string str3(str2);
	cout << str3 << endl;
	//4
	string str4 = str2;
	cout << str4 << endl;



	//No.2 基本操作
	cout << (str3 == str4) << endl;
	cout << (str3 > str4) << endl;

	string password;
	cin >> password;
	cout << password;
	//原理是:运算符重载 后面会讲
	//C++中尽量用string 不要用char*  
	//比较直接比较即可
	//>  < != ==
	if (password == string("12345"))
	{
		cout << endl << "密码正确" << endl;
	}

	//连接直接用加法
	//字符串a+字符串b
	string name = "张三";
	string info = name + "很帅";
	cout << info << endl;

	//上述复杂的用法
	cout << info.compare(name) << endl;  //和strcmp 返回值一样
	cout << info.append(name) << endl;	 //和strcat 返回值一样
	cout << info.length() << endl;	   //当前长度
	cout << info.size() << endl;


	//下标的方式访问
	for (int i = 0; i < info.length(); i++)
	{
		cout << info[i];
	}
	cout << endl;
	for (int i = 0; i < info.length(); i++)
	{
		cout << info.at(i);
	}
	cout << endl;


	cout << info.capacity() << endl;   //容量


	//和C语言string.h有区别的 char* 
	// 不能用%s的方式打印
	//printf("%s\n", info);   错
	// 图形库中传char* 函数 都不能直接用string类型
	//提供两个函数: c_str() data();
	printf("%s\n", info.c_str());
	printf("%s\n", info.data());
	return 0;
}

C++自动推断类型

  • auto类型
    • auto 类型自动推断: 一定要有赋值 所以不能单独定义变量
    • auto a; 没有赋值 推断不出来
  • decltype类型
#include <iostream>
using namespace std;

struct MM 
{
	int age;
};
MM g_MM = { 12 };
MM* createMM() 
{
	MM* p=&g_MM;
	return p;
}
int Max(int a, int b) 
{
	return a > b ? a : b;
}
void print(int(*Max)(int, int), int a, int b) 
{
	cout << Max(a, b) << endl;
}
void printData(int(*)(int, int), int, int) 
{
	cout << "另一个函数" << endl;
}

int main() 
{
	auto a = 1;				//int 
	a = 134;
	auto pMM = createMM();
	cout << pMM->age << endl;
	auto pFunc = print;		//void (*)(int(*)(int, int), int , int ) 
	pFunc(Max, 1, 3);
	pFunc = printData;
	pFunc(Max, 1, 3);
	int* p = nullptr;			//新的空 等效C语言NULL
	//decltype 不需要赋值

	decltype(123) num = 123;    //decltype(123) 表示一个int类型
	//函数指针必须取地址
	decltype(&print) ppFunc;
	ppFunc = printData;
	//推断一个int
	decltype(num) Num = num;
	decltype(&num) pNum = &num;	//当你们用的时候,不知道类型,推断定义变量去赋值
	return 0;
}

C++动态内存申请

C++申请的内存是自由存储区的,C语言的堆区内存,所以C++类的对象内存不能用malloc申请

  • new申请内存
    • 申请单个变量内存
    • 申请一段内存
    • 申请内存可以手动初始化
    • 申请内存后可以再分配
  • delete释放内存
    • 释放单个变量内存:delete 指针名;
    • 释放一段变量内存: delete[] 指针名;
#include <iostream>
using namespace std;
struct MM 
{
	char name[20];
	int age;
	int num;
};
void testOne() 
{
	int* pInt = new int;
	*pInt = 123;
	cout << pInt[0] << endl;
	delete pInt;
	pInt = nullptr;
	
	char* pc = new char;
	delete pc;

	int* pNum = new int(1234);	//申请并且初始化
	cout << pNum[0] << endl;
	delete pNum;
	
	MM* pMM = new MM({ "name",12,1101 });
	cout << pMM->name << "\t" << pMM->age << "\t" << pMM->num << endl;
}
void testTwo() 
{
	//一段内存的申请
	int size = 4;
	int* pArray = new int[size];		//int pArray[4];
	MM* pMM = new MM[4];				//MM pMM[4];
	delete[] pArray;
	delete[] pMM;
	pArray = nullptr;
	pMM = nullptr;

	int* pNum = new int[4]{ 1, 2, 3, 4 };
	for (int i = 0; i < 4; i++) 
	{
		cout << pNum[i] << "\t";
	}
	cout << endl;
	delete[] pNum;
	pNum = nullptr;
}
void testThree() 
{
	char* pMem = new char[1024];
	//在原来上面拿个20字节存整数
	int* pInt = new(pMem + 0) int[5]{ 1,2,3,4,5 };
	//在原来上面拿出20个存字符
	char* pChar = new(pMem + 20) char[20]{"ILoveyou"};
	//等效:char* pChar = new(pInt + 5) char[20]{"ILoveyou"};
	delete[] pMem;
	pMem = nullptr;
}
int main() 
{
	testOne();
	testTwo();
	testThree();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值