C++ 接触的较少,为便于学习总结 C++ 的相关编程语法,故总结了部分 与C语言之间的不同。(仅做本人参考学习使用)
1,全新的程序程序思维,C 语言是面向过程的,而 C++ 是面向对象的。
2,C语言有标准的函数库,它们松散的,只是把功能相同的函数放在一个头文件中;而 C++ 对于大多数的函数都是有集成的很紧密,特别是C语言中没有的 C++ 中的API是对Window系统的大多数API 有机的组合,是一个集体。但你也可能单独调用API。
3,特别是 C++ 中的图形处理,它和语言的图形有很大的区别。C语言中的图形处理函数基本上是不能用在中 C++ 中的。C语言标准中不包括图形处理。
4,C 和 C++中都有结构的概念,但是在 C语言中结构只有成员变量,而没成员方法,而在 C++ 中结构中,它可以有自己的成员变量和成员函数。但是在C语言中结构的成员是公共的,什么想访问它的都可以访问;而在 VC++ 中它没有加限定符的为私有的。
4,C语言可以写很多方面的程序,但是 C++ 可以写得更多更好,C++ 可以写基于DOSr程序,写DLL,写控件,写系统。
5,C语言对程序的文件的组织是松散的,几乎是全要程序处理;而 C++ 对文件的组织是以工程,各文件分类明确。
6,C++ 中的IDE很智能,和VB一样,有的功能可能比VB还强。
7,C++ 对可以自动生成你想要的程序结构使你可以省了很多时间。有很多可用的工具如加入 MFC 中的类的时候,加入变量的时候等等。
8,C++ 中的附加工具也有很多,可以进行系统的分析,可以查看API;可以查看控件。
9,调试功能强大,并且方法多样。
总结:C++ 与 C语言 两者最大的区别在于一个是面向对象,一个面向过程。但是就基础用法而言两者的语法较通处很多。在练习算法设计与计算机系研究生专业课的算法考试中,几乎可以完全通用。
C++
#include
#include
#include
#include
C
#include
#include
#include
#include
#include
#include
# include
# include
# include
# include
#include
注:以上两种语言的头文件没有给出直接对应的关系,在使用时若不知道需要哪些头文件可以直接全部复制使用。
stdio 的全称为:standard input output
负责输入与输出
#include
#include
#include
#include
#include
#include
代码最好保存为 .cpp 文件(即 C++文件),选择 C++ 语言进行提交。因为 C++ 向下兼容 C,采用这种方式可以尽可能防止一些 C 与 C++ 之间的区分而导致的编译错误。
在 C++ 中可以直接使用 布尔型, 在C语言中要加
stdbool.h 文件。 %d 输出 bool 变量
C++
说明: C++ 的 struct成员包含成员函数,(可以理解为有函数的结构体)
struct Hello{
void sayHello(char *name){
printf("你好,%s\n",name);
}
};
int main()
{
Hello hello;
hello.sayHello();
exit(0);
}
C
说明: C语言的struct的成员只能是数据,不支持函数,因此若要定义结构体的函数需要使用函数指针实现
struct Hello{
void (*sayHello)(char* name); //函数名为指针类型
};
void sayHello(char* name){
printf("你好,%s\n",name);
}
int main(){
struct Hello hello; //声明结构体的变量,需要加struct
hello.sayHello=sayHello; //C语言需要使用函数指针指向函数的声明!!!
hello.sayHello("浅若清风");
return 0;
}
以一维和二维动态数组为例:
C++
创建: C++ 使用 new
自动为动态数组分配空间
删除: C++ 使用 delete
为动态数组释放内存
void f()
{
int n;
int m;
int *Array1; //声明一维动态数组
Array1=(int *)calloc(n,sizeof(int)); //为一维动态数组分配空间,元素个数为n
int **Array2; //声明二维动态数组
Array2=(int **)calloc(n,sizeof(int*)); //为二维动态数组分配空间(n个指针空间),n行
for(int i;i<n;++i)
{
Array2[i]=(int*)calloc(m,sizeof(int)); //为每一行分配内存空间(m个整数空间),m列
}
//释放内存
delete []Array1;
for(int i=0;i<n;++i){
delete[]Array2[i];
}
delete[]Array2;
}
C
创建: C使用 calloc 为动态数组分配空间
删除: C使用 free() 为动态数组释放内存
void f()
{
int n;
int m;
int *Array1; //声明一维动态数组
Array1=new int(n); //为一维动态数组分配空间,元素个数为n
int **Array2; //声明二维动态数组
Array2=new int*[n]; //为二维动态数组分配空间(n个指针空间),n行
for(int i;i<n;++i)
{
Array2[i]=new int[m]; //为每一行分配内存空间(m个整数空间),m列
}
//释放内存
free(Array1);
for(int i=0;i<n;++i){
free(Array2[i]);
}
free(Array2);
}
malloc函数与calloc函数的区别: malloc函数:不能初始化所分配的内存空间,在动态分配完内存后,里边数据是随机的垃圾数据。
calloc函数:能初始化所分配的内存空间,在动态分配完内存后,自动初始化该内存空间为零。
类是 C++ 引入的类型,可以包含数据,也可以包含函数,解决了C语言 struct 只能包含数据的缺陷。
另外一个不同点是 struct 是默认 public,而 class 默认 private
下面以一个链队的例子,来体现C++的 class的用法,并与C语言用struct实现进行对比
C++
#include
using namespace std;
class QueueNode //队列结点
{
public:
QueueNode() :page(-1), next(NULL) {};
QueueNode(int m_page, QueueNode* m_next = NULL) :page(m_page), next(m_next) {};
~QueueNode() { next = NULL; }
public:
int page;
QueueNode* next; //储存下一个结点的指针
};
class LinkQueue //队列
{
public:
LinkQueue() { front = rear = new QueueNode(); count = 0; }
void push(int m_page); //加到队尾
int pop(); //取出队首结点(此例是包含头指针的链队,头指针的下一个结点才是队首结点),并返回该结点值
bool exist(int page); //判断队列中是否有结点的值为page
void print(int page); //打印队列
QueueNode* front; //队首指针
QueueNode* rear; //队尾指针
int count; //统计结点数量
};
void LinkQueue::push(int m_page)
{
QueueNode* p = new QueueNode(m_page);
p->next = NULL;
rear->next = p;
rear = p;
count++;
}
int LinkQueue::pop()
{
if (front == rear) {
printf("队列为空!\n");
return 0;
}
int top = front->next->page; //记录队首,作为返回值
QueueNode* tmp = front->next;
front->next = tmp->next;
if (rear == tmp) //只剩下一个元素,此题不会出现这种情况
{
rear = front;
}
delete tmp;
count--;
return top;
}
void LinkQueue::print() //打印队列
{
QueueNode* p = front;
while (p->next != NULL)
{
printf("%d ", p->next->page);
p = p->next;
}
printf("\n");
}
bool LinkQueue::exist(int page) { //判断队列中是否存在元素page
QueueNode*p = front;
while (p->next != NULL) {
if (p->next->page == page) {
return true;
}
else {
p = p->next;
}
}
return false;
}
int main()
{
LinkQueue queue;
for(int i=0;i<5;++i)
{
queue.push(i);
}
queue.print();
if(queue.exit(6)) printf("yes!\n");
else printf("no!\n");
int top=queue.pop(); //获得队首元素值
printf("队首元素的值为%d\n",top);
}
C语言
# include
# include
# include
struct QueueNode
{
int page;
struct QueueNode *next;
};
typedef struct LinkQueue {
struct QueueNode* front;
struct QueueNode* rear;
int count;
};
void initQueue(struct LinkQueue *q)
{
q->front = q->rear=(struct QueueNode *)malloc(sizeof(struct QueueNode));
q->front->next = NULL;
q->count=0;
}
void push(struct LinkQueue *q, int page)
{
struct QueueNode* node = (struct QueueNode*)malloc(sizeof(struct QueueNode));
node->next = NULL;
node->page = page;
q->rear->next = node; //与新增结点链接
q->rear=node; //尾指针后移
q->count++;
}
int pop(struct LinkQueue*q) //队首元素出队,并返回数值
{
int top = q->front->next->page;
struct QueueNode *node = q->front->next;
q->front->next = q->front->next->next;
free(node);
return top;
}
bool exist(struct LinkQueue*q, int page) //判断队列是否有结点的值等于page
{
struct QueueNode *node = q->front;
while (node->next != NULL)
{
if (node->next->page == page) return true;
else node = node->next;
}
return false;
}
void print(struct LinkQueue *q)
{
struct QueueNode *node =q->front;
while (node->next != NULL)
{
printf("%d ", node->next->page);
node = node->next;
}
printf("\n");
}
int main()
{
struct LinkQueue queue;
initQueue(&queue);
for (int i = 1; i < 5; ++i)
{
push(&queue, i);
}
print(&queue);
if (exist(&queue, 3)) printf("yes!\n");
printf("======\n");
if (exist(&queue, 6)) printf("yes!\n");
else printf("no!\n");
int top = pop(&queue);
printf("队首元素的值为%d\n", top);
}