C、C++过渡

#define _crt_secure_no_warnings
#include<iostream>
#include<stdlib.h>
using namespace std;
#include<stdio.h>

面向对象与面向过程的区别

面向过程

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

面向对象

以功能来划分问题。功能上的统一保证了面向对象设计的可扩展性,就是把构成问题事物分解成各个对象,建立对象的目的不是
为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为

c和c++不同:

1、后缀不同.c、.cpp
2、函数的区别
(1)c中函数编译时不检查返回值,且默认返回值为整形
c++中要求有返回值类型
funtest()
{}
int main()
{
 int ret = 0;
 ret = funtest();
 return 0;
}
(2)c中可传任一参数,编译时不检查传参的类型,但编译时,会传参过去
c++编译不通过
void  funtest()
{}
int main()
{
 funtest();
 funtest(10);
 funtest(10, 20);
 funtest(10, 20, 30);
 return 0;
}
(3)缺省参数
c++中存在缺省参数,c中不存在
void* getmemory(int bytesize = 100)
{
 return malloc(bytesize);
}
int main()
{
 getmemory();
 getmemory(200);
 return 0;
}
缺省参数不能同时在函数定义和声明中出现,只能二选一,如下图所示。
void funtest(int a);
void funtest(int a){}
当两个同时为int a=10时编译器报错
void funtest(int a = 10);
void funtest(int a = 10){}

缺省参数一般放在声明中
当他人使用时,为防止源码泄露,需将缺省等放在头文件或者.lib文件中
一般情况下,放在声明中
缺省值必须是常量或者全局变量 
int g_a = 10;
void funtest(int a = g_a);

全缺省参数
参数调用约定
void funtest(int a = 10, int b = 20, int c = 30)
{
 printf("a = %d\n", a);
 printf("b = %d\n", b);
 printf("c = %d\n", c);
}
int main()
{
 funtest();
 funtest(1);
 funtest(1,2);
 funtest(1,2,3);
 return 0;
}

半缺省参数
参数只能从右往左依次传给参数
void funtest(int a, int b, int c = 30)
void funtest(int a, int b = 20, int c = 30)
{
  printf("a = %d\n", a);
  printf("b = %d\n", b);
  printf("c = %d\n", c);
}
int main()
{
 funtest(1);
 return 0;
}

3、编译器对函数修改的规则不同
重载函数
定义:c++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表必须不同(参数的
个数,类型,次序),仅仅返回值的类型不同不能构成重载
编译时,编译器会根据传的参数进行参数的推演,以确定调用的具体的函数
int add(int left, int right)
{
 return left + right;
}
double add(double left, double right)
{
 return left + right;
}
char add(char left, char right)
{
 printf("%c\n",left+right);
 return left + right;
}
char add(char left, int right)
{
 printf("%c\n",left+right);
 return left + right;
}
int main()
{
 add(1, 2);
 add(1.0, 2.0);
 add('1', '2');//整形输出99,字符输出c,字符型+字符型=字符型
 add('1', 2);//整形输出51,字符输出3,所以字符型+整形=整形
 return 0;
}
void funtest()
{}
//仅仅是返回值类型不同不能构成重载,如下图所示
//int funtest()
//{}
//参数个数不同
void funtest(int a)
{}
//参数类型不同
void funtest(char a)
{}
void funtest(int a, char b)
{}
//参数类型次序不同
void funtest(char a, int b)
{}

可成功编译
void funtest()
{}
void funtest(int a = 10)
{}

编译失败
因为对重载函数的调用不明确,缺省函数不传参数的时候可用缺省值
void funtest()
{}
void funtest(int a = 10)
{}
int main()
{
 funtest();
 return 0;
}
运行结果如下图所示

为什么c语言中不支持重载?

int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } char add(char a, char b) { return a + b; }
//函数不定义只声明,在生成的时候会出错,如下图所示 int add(int a, int b); double add(double a, double b); char add(char a, char b); int main() { add(1, 2); add(1.0, 2.0); add('1', '2'); return 0; }
在c中所有函数均被修改为_add,会产生重复定义
在c++编译器中被编译成(?add@@yahhh@z)、(?add@@yannn@z)、(?add@@yaddd@z)

允许在c++中以c的风格运行程序的语句为:
entern "c" int add(int left,int right)

==entern与static==
void funtest(int a = 10)
{}
void funtest(int a)
{}
int main()
{
 funtest();
 funtest(5);
 return 0;
}


阅读更多
个人分类: C++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭