2020.10.28 第2课 C++与C的区别

本文主要探讨了C++与C在结构体上的深入区别,讲解了C++中的string类型基础用法,引入了类的思想在结构体中的应用,详细阐述了结构体对象的构造过程以及通过new操作符创建对象的步骤,最后引导读者体会面向对象编程的核心理念。
摘要由CSDN通过智能技术生成

2020.10.28 第2课 C++与C的区别

一、结构体的基本区别

#include <iostream>
#include <string.h>
using namespace std;
struct MM     定义方式一样
{
	char name[20];
	int age;
};

int main() 
{
	MM  myMM = { "小仙女",18 };   类型不需要struct关键字,用到类型的时候直接结构体名字即可
	cout << myMM.name << "\t" << myMM.age << endl;  访问 还是 .
   	MM* p = new MM;
	strcpy(p->name, "小可爱");   指针指向
	p->age = 19;
	cout << p->name << "\t" << p->age << endl;
	return 0;
}

深入区别

#include <iostream>      
#include <string>
using namespace std;
//结构体-->类:多个事物的个体的共同属性的抽象
//类: 属性:描述特征(数据类型描述)  行为/方法(操作:成员函数)
//对象: 类的具体化/实例化
struct MM 
{
	//属性: 数据成员
	string name;
	int age;
	//行为/方法  成员函数
	void print()    每一个对象对自己做的事情
	{ 
		cout << name << ":" << age << endl;
		sleep();
		shopping();
	}
	void sleep();		//睡觉
	void shopping()   //购物
	{
		//默认为内联函数
		cout << "花钱操作" << endl;
	}
};
//在结构体外面如何实现
void MM::sleep()     类的前缀 作用域分辨符
{
	cout << "助眠动作" << endl;
}

int main() 
{
	//成员函数的调用和数据成员是一样的  C++里面函数也可以是数据的一部分
	MM  sr = { "诗染",38 };
	//cout << sr.name << ":" << sr.age << endl;
	//sr.shopping();
	//sr.sleep();  
	sr.print();        打印行为
	cout << endl;
	MM* pMM = new MM;          new出来的对象,指向一段内存,并没有初始化,一段乱码,两个不用的对象是单一的个体,互不影响
	//cout << pMM->name << ":" << pMM->age << endl;
	//pMM->shopping();
	//pMM->sleep();             不同的对象共同的行为
	pMM->print();
	cout << endl;
	return 0;
}

·

二、string类型的基本用法

#include <string>		//C++string头文件
#include <cstring>		//C语言头文件
#include <iostream>
/*
	1.string不是char *
	2.如何使用string
*/
using namespace std;
int main() 
{
	//1.集中常用的创建过程   直接在后面括号 等于    常量或变量
	string str("ILoveyou");
	cout << str << endl;
	string str2 = "IMissyou";
	cout << str2 << endl;
	string str3(str2);
	cout << str3 << endl;
	string str4 = str3;
	cout << str4 << endl;
	//2.和C语言的区别
	printf("%s\n", str4);	//string不是char *
	//c_str();
	printf("%s\n", str4.c_str());
	//3.常规运算:
	string str5 = str2 + str4;
	cout << str5 << endl;
	//> < != ==
	if (str5 > str2) 
	{
		cout << "max:" << str5 << endl;
	}
	else 
	{
		cout << "Max:" << str2 << endl;
	}
	return 0;
}

三、结构体中一些类的思想

#include <iostream>      
#include <string>
using namespace std;     深入区别
//结构体-->类:多个事物的个体的共同属性的抽象 
//类: 属性:描述特征(数据类型描述)  行为/方法(操作:成员函数)
//对象: 类的具体化/实例化
struct MM 
{
	//属性: 数据成员
	string name;
	int age;
	//行为/方法  成员函数
	void print()    每一个对象对自己做的事情
	{ 
		cout << name << ":" << age << endl;
		sleep();
		shopping();
	}
	void sleep();		//睡觉
	void shopping()   //购物
	{
		//默认为内联函数
		cout << "花钱操作" << endl;
	}
};
//在结构体外面如何实现
void MM::sleep()     类的前缀 作用域分辨符
{
	cout << "助眠动作" << endl;
}

int main() 
{
	//成员函数的调用和数据成员是一样的  C++里面函数也可以是数据的一部分
	MM  sr = { "诗染",38 };
	//cout << sr.name << ":" << sr.age << endl;
	//sr.shopping();
	//sr.sleep();  
	sr.print();        打印行为
	cout << endl;
	MM* pMM = new MM;          new出来的对象,指向一段内存,并没有初始化,一段乱码,两个不用的对象是单一的个体,互不影响
	//cout << pMM->name << ":" << pMM->age << endl;
	//pMM->shopping();
	//pMM->sleep();             不同的对象共同的行为
	pMM->print();
	cout << endl;
	return 0;
}

四、结构体构造对象的而过程

三种初始化数据的方式
#include <iostream>
#include <string>
using namespace std;
//构造对象的而过程--->创建结构体变量的过程
//C++中可以删除默认的函数 delete 关键字
struct MM
{
	//MM()=delete;			//删除默认的构造函数
	string name;
	int age;
	//如何通过成员给数据初始化
	//1.传参
	void initData(string sName, int sAge)
	{
		name = sName;
		age = sAge;
	}
	//2.返回引用
	string& getName()
	{
		return name;
	}
	int& getAge()
	{
		return age;
	}
	void print()
	{
		cout << name << ":" << age << endl;
	}
};
//权限区别  C++中的类除了权限之外都可以当作结构体使用
/*
  结构体构造函数:
	1.名字和结构体名字相同
	2.没有返回值
	3.不需要自己调用,创建对象的收调用
	4.构造函数用来构建对象,对象形态必须和构造函数一致
	5.不写构造函数,存在一个默认的构造函数(默认的构造函数没有参数)
	6.写了构造函数,默认的就不存在
*/
struct Girl
{
	string name;
	int age;
	//写了构造函数,默认的就不存在,所以不能构造无参对象
	Girl(string sName, int sAge)
	{
		name = sName;
		age = sAge;
		cout << "调用构造函数" << endl;
	}
	//函数重载
	Girl()
	{
		cout << "调用无参构造函数" << endl;
	}
	void print()
	{
		cout << name << "\t" << age << endl;
	}
};
int main()
{
	//没有区别
	//5.不写构造函数,存在一个默认的构造函数(默认的构造函数没有参数)
	MM mm = { "mm1",18 };    //调用默认的构造函数
	MM array[3];			 //调用默认的构造函数
	MM* pMM = new MM;		 //调用默认的构造函数
	//1.第一种 成员函数方式
	MM myMM;
	myMM.initData("莫非", 18);
	myMM.print();
	//2.第二种成员函数方式
	MM* pM = new MM;
	pM->getName() = "夜舞";
	pM->getAge() = 16;
	pM->print();
	//3.创建的对象参数必须要和构造函数一致
	Girl mygirl("小可爱",18);
	cout << mygirl.name << "\t" << mygirl.age << endl;
	Girl boy;
	return 0;
}    
    

五、new一个对象的过程

#include <iostream>
#include <string>
/*
	构建对象中new一个对象理解
*/
using namespace std;
struct MM
{
	string name;
	int age;
	MM()
	{
		cout << "一般写个,可以便于构造数组" << endl;
	}
	MM(string sName,int sAge)
	{
		name = sName;
		age = sAge;
		cout << "有参构造函数" << endl;
	}
	void print();
};
void MM::print()
{
	cout << name << ":" << age << endl;
}
int main()
{
	//数组:多个普通的变量 
	//error C2512: “MM”: 没有合适的默认构造函数可用
	MM array[3]; //array[0] array[1] array[2]
	/*
	构造对象中new一个对象理解!!!
		1.创建对象指针不调用构造函数
	过程:
		1.创建一个无名对象	MM 无名对象("MM",18)
		2.把无名对象首地址赋值给这个指针
	*/
	MM* pMM = nullptr;
	pMM = new MM;				//调用无参的构造函数
	pMM = new MM("MM", 18);		//调用有参的构造函数
	//MM 对象名("MM", 18);		上面没有名字
	//pMM = new MM("MM");		构建无名的对象de形态也要与构造函数一致
	MM* pM = new MM("mm1", 19);
	pM->print();
	return 0;
}

六、感受面向对象编程的思想

感受面向对象的链表   new一个对象 对象做什么
#include <iostream>
#include <string>
using namespace std;
/*
	写链表为例:流程基本差不多
*/
struct Node
{
	int data;
	Node* next;
	Node(int data);					//构造函数	
	Node(int data, Node* next);		//
};
//负责把用户的数据变成节点
Node::Node(int sData)
{
	data = sData;
	next = nullptr;
}
//负责创建节点
Node::Node(int sData, Node* sNext)
{
	//这个节点的数据是多少
	data = sData;
	//这个节点的指针是多少
	next = sNext;
}
//C++面向对象编程:把链表的属性抽象
struct List
{
	Node* headNode;				//结构体指针
	int listSize;
	List()						//链表最初形态
	{
		headNode = nullptr;		//开始为空
		listSize = 0;			//size为0
	}
	void insertByHead(int data)	//不再需要指定链表,就是这个链表
	{
		headNode = new Node(data, headNode);	//new一个对象,调用构造函数的过程
        //new一个对象:首先创建一个无名对象
        //Node newNode(data,headNode);   	//他的next指针给headNode
        //把当前节点的首地址赋值给指针
		listSize++;
	}
	void print()
	{
		Node* pMove = headNode;
		while (pMove != NULL)
		{
			cout << pMove->data << "\t";
			pMove = pMove->next;
		}
		cout << endl;
	}

};

int main()
{
	List* pList = new List;	//面向对象的过程 第一步 创建对象(调用构造函数)
	pList->insertByHead(1);
	pList->insertByHead(2);
	pList->insertByHead(3);
	pList->print();
	return 0;
}

七、第1课作业

#include <iostream>
using namespace std;
void myMalloc(int**& p, int row, int cols) 
{
	p = new int* [row];
	for (int i = 0; i < row; i++) 
	{
		p[i] = new int[cols];
	}
}
void myFree(int**& p, int row) 
{
	for (int i = 0; i < row; i++) 
	{
		delete[] p[i];
	}
	delete[] p;
	p = nullptr;
}
int main() 
{

	int** array = nullptr;
	myMalloc(array,3,3);
	for (int i = 0; i < 3; i++) 
	{
		for (int j = 0; j < 3; j++) 
		{
			array[i][j] = i + j;
			cout << array[i][j] << "\t";
		}
		cout << endl;
	}
	myFree(array, 3);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值