C++与C的区别 day2

结构体区别

  • 首先在类型上不再需要struct关键字,直接可以用结构体名
  • C++结构体中可以允许函数存在,C语言不行

1.函数可在结构体中声明,在外定义,也可以在结构体中直接声明和定义
2.结构体中的函数访问数据是可以直接访问的
3.调用数据成员和C语言一样
[1] 对象(结构体变量).成员
[2] 对象指针->成员
[3] (*对象指针).成员
4. C++在没有写构造函数权限限定的时候,用法和C语言是一样的

#include 
#include 
using namespace std;
struct MM//定义结构体
{
	char name[20];
	int age;
	void print()
	{
		cout << name << "\t" << age << endl;
	}
	void printData();//在结构体中声明
	char* getName()//通过外部函数修改数据
	{
	   return name;
	}
	int& getAge()//通过外部函数修改数据
	{
	   return age;
	}
};
void  MM::printData()//在结构体外定义
{
	cout << name << "\t" << age << endl;
}

int main()
{
	struct MM girl = { "小瓜",19 };//C语言类型
	MM boy = { "大瓜",20 };//C++类型不在需要struct关键字
	MM* p = &boy;
	strcpy(boy.getName(), "傻蛋");
	girl.getAge() = 22;
	girl.print();
	boy.printData();
	return 0;
}

输出结果:
C++与C的区别 day2_第1张图片

动态内存申请

  • C语言动态内存申请
    1.malloc 不带初始化
    2.calloc 带初始化
    3.realloc 重新申请
    4.free 释放

  • C++的动态内存申请
    1.new(申请)和delete(释放)
    2.单个变量内存申请
    3.数组的动态申请
    4.结构体内存申请

#include 
#include 
using namespace std;

//单个变量申请内存
void testoneMemory()
{
	//单个变量内存申请不做初始化
	int* pInt = new int;
	*pInt = 123;
	cout << *pInt << endl;
	char* pChar = new char;
	*pChar = 'B';
	cout << *pChar << endl;
	//申请内存初始化,()就是给单个数据初始化
	int* pNum = new int(1234);
	cout << *pNum << endl;
	char* pchar = new char('A');
	cout << *pchar << endl;
	//释放内存,并且置空
	delete pInt; pInt = nullptr;
	delete pChar; pChar = nullptr;
	delete pNum; pNum = nullptr;
	delete pchar; pchar = nullptr;
}
//数组的内存申请
void testArrayMemory()
{
	//不带初始化的
	int* pInt = new int[3];//相当于生产了int pInt[3]的数组
	char* pChar = new char[16];
	strcpy(pChar, "ILoveyou");
	cout << pChar << endl;
	//长度可以是变量也可以是用户输入的量,只要是值就行
	//int a;
	//cin >> a;
	//int* Int = new int[a];相当于生产了int Int[用户输入的大小]的数组
	//带初始化的
	int* pNum = new int[3]{ 1,2,3 };
	for (int i = 0; i < 3; i++)
	{
		cout << pNum[i] << " ";
	}
	cout << endl;
	char* str = new char[16]{ 'A','B','C' };
	cout << str << endl;
	str = new char[20]{ "ILoveyou" };
	cout << str << endl;
	//释放内存,数组释放不需要大小,释放方式有两种,delete 指针和 delete[] 指针 
	delete[] pInt; pInt = nullptr;
	delete[] pChar; pChar = nullptr;
	delete[] pNum; pNum = nullptr;
	delete[] str; str = nullptr;
}
struct MM
{
	char* name;
	int age;
	//成员函数
	void printMM()
	{
		cout << name << "\t" << age << endl;
	}
};
//结构体内存申请
void testStructMemory()
{
	MM* pMM = new MM;
	//结构体中指针要做二次申请才能strcpy或者是赋值
	pMM->name = new char[20];
	strcpy(pMM->name, "小瓜");
	pMM->age = 19;
	pMM->printMM();
	//释放顺序和申请顺序相反
	delete[] pMM->name;
	delete pMM;
}
int main()
{
	testoneMemory();
	testArrayMemory();
	testStructMemory();
	return 0;
}

内存池

  • 允许大家申请一段内存,共给程序使用,综合管理内存
    C++与C的区别 day2_第2张图片
#include 
using namespace std;
void testMemory()
{
	char* memorySum = new char[1024];
	//int* pNum=new (申请内存的开始位置)int[3];
	int* pNum = new (memorySum)int[3]{1,2,3};
	//char* pstr=new(pNum+3)char[20]{"ILoveyou"};指针移动,等效下面语句
	char* pstr = new(memorySum + 12)char[20]{ "ILoveyou" };
	//int 占四字节,申请了三个大小,所以memorySum首地址加12,
	for (int i = 0; i < 3; i++)
	{
		cout << pNum[i] << " ";
	}
	for (int i = 0; i < 3; i++)
	{
		cout << ((int*)memorySum)[i] << " ";//强制转换,将char类型转换成int型
		//相当于(int*)memorySum替换pNum
	}
	cout << endl;
	cout << pstr << endl;
	//这两句等同
	cout << (memorySum + 12) << endl;

}
int main()
{
	testMemory();
	return 0;
}

运行结果:
C++与C的区别 day2_第3张图片

string类型

  • string创建
    1.带初始化 2.不带初始化 3.通过另一个字符串创建

  • string基本操作
    1.拷贝 2.赋值 3.连接 4.比较

  • C++string与C语言sting.h的区别

  • string其他函数操作

#include //注意与string.h的区别
#include //string.h和cstring一样
#include 
#include 
using namespace std;
//创建string类型
void createString()
{
	string str1;
	str1 = "ILoveyou";
	cout << str1 << endl;
	string str2("ILoveyou");
	cout << str2 << endl;
	string str3 = "ILoveyou";
	cout << str3 << endl;
	string str4(str3);
	cout << str4 << endl;
	string str5 = str4;
	cout << str5 << endl;
}
//string类型基本操作
void operatorString()
{
	string str1 = "one";
	string str2 = "two";
	string str3 = str2;
	cout << str3 << endl;
	string str4 = str1 + str2;//没有减法只有加法
	if (str1 > str2)//比较依然是char*比较
	{
		cout << "大的" << str1 << endl;
	}
	else
	{
		cout << "大的" << str2 << endl;
	}
	cout << str4 << endl;
}
void compareCAndcpp()
{
	//C++中string是一个自定义类型(类),目前当做结构体即可
	//C++string 不能用到C语言的字符串处理函数
	//C++转C语言char* 需要C_str()或者data()函数
	string str1 = "ILoveyou";
	printf("%s\n", str1.c_str());
	printf("%s\n", str1.data());
	//直接把数字转换为相应的字符串函数to_string()
	string str2 = to_string(1234);
	cout << str2 << endl;
}
void exoperator()
{
	//采用下标法打印string
	string str = "IMissyou";
	//C++string中没有记录'\0'
	for (int i = 0; i < 8; i++)
	{
		cout << str[i] << " ";
	}
	cout << endl;
	string mystring = "IMissyou";
	cout << "mystring:" << mystring.size() << endl;//返回字符个数
	string strEmpty;
	if (strEmpty.empty())//这个函数里面会返回一个长度,如果这个长度==0,就是真,如果不是就是假
	{
		cout << "string为空" << endl;
	}
	else
	{
		cout << "string不为空"<<endl;
	}
}
int main()
{
	createString();
	operatorString();
	compareCAndcpp();
	exoperator();
	return 0;
}

作业:用函数传参方式,动态内存分配创建二维数组

#include 
#include 
using namespace std;
void arraya(int**& arr)//int**& arr==实参
{
	arr = new int* [2];//创建2行
	for (int i = 0; i < 2; i++)
	{
		arr[i] = new int[2];//创建2列
	}
}
int main()
{ 
	int** arr = nullptr;
	arraya(arr);
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 2; j++)
			cin >> arr[i][j];
	}
	for (int i = 0; i < 2; i++)
	{
		cout << endl;
		for (int j = 0; j < 2; j++)
			cout << arr[i][j]<<" ";
	}
	return 0;
}

你可能感兴趣的:(励志学习C瓜瓜,c语言,c++,开发语言)