为了完成教学中的项目,需要了解一些C++的知识,也需要知道它和C的一些区别。
现在开始看一些它们的区别吧
1、首先在C++中,malloc是返回值是void
所以char *p=malloc(100);
在C++中无法使用,需要强转:char *p=(char *)malloc(100)
其实在C++很多时候经常用 new,是C++的一个关键字,不需要包含任何头文件
char *p=new char[100];//在堆中分配100个char
delete []p;//释放一个数组,如果只有p那么只释放第一个char
char *p1=new char;//在堆中分配一个char
delete p1;//释放一个char
//c++语言可以兼容c语言的内存管理机制,但如果用malloc分配的内存就必须要free
如果用new分配的就必须用delete,不能混合使用
2、在c语言中,可用下面的方法绕过const
const int a=10;
int *p2=(int *)&a;
*p2=100;
printf("%d\n",a);
但在C++中不会修改a的值
3、在c语言中
void test (int a=10);//c语言中是非法的,C++是合法的,此时调用的时候还是根据输入的实参调用这个函数,但是如果缺省函数的实参,就会使用a=10.这个叫形参的缺省值
{
}
void test (int a,int b);
{
}
//在C语言中,这种全局的函数名字不允许相同,所以这是非法的,但在C++中是合法的,这叫重载,根据调用的时候参数的不同,自动调用相应的函数
4、当然最主要的区别还是C++是面向对象的= =
#include <stdio.h>
#include <string.h>
struct man
{
char name[20];
int age;
void set_name(const char *p)//在结构体中可以使用函数
{
strcpy(name, p);
}
void set_age(int a)
{
age = a;
}
const char *get_name()
{
return name;//在结构体中,它就不在内存中,具体在堆在栈中应该看定义它的语法
}
int get_age()
{
return age;
}
man()//没有返回值,名字和结构名字相同,这叫构造函数
{
printf("hello world\n");
}
man(const char *p, int a = 0)//构造函数的重载
{
age = a;
strcpy(name, p);
}
~man()//析构函数
{
printf("~man\n");
}
};
int main01()
{
//man m;//前面不用加struct
//m.set_name("Tom");//C++一般这样设置,而不是在这里调用strcpy
// m.set_age(20);
// printf("%s, %d\n", m.get_name(), m.get_age());//虽然m在栈中,但此时m并未消失,m.get_name()地址是有效的
//如果想把m放到堆中
man *m = new man;//这里结构成了堆里面一个变量
m->set_name("tom");//因为m是指针,所以需要改成->
m->set_age(20);
printf("%s, %d\n", m->get_name(), m->get_age());
delete m;
man m1;//结构成了栈里面一个变量了,这里调用的是没有参数的构造函数
man m2("abc", 100);// 明确的调用有const char *参数的构造函数
printf("%s, %d\n", m2.get_name(), m2.get_age());
man *m3 = new man("张三", 30);
printf("%s, %d\n", m3->get_name(), m3->get_age());
delete m3;
return 0;
}
struct A//这里分析构造和析构的行为
{
int age;
A(int a)
{
age = a;
printf("A, %d\n", a