C到C++的过渡
/*
*运行平台:Visual Studio 2015(Debug x86)
*参考资料:《C++ Primer Plus(第6版)》,传智扫地增C++基础课程
*/
目录
一、面向对象的思想
1、什么是面向对象的思想
这个对象有下面的两种说法:
- 一般意义上的对象:是现实世界中一个实际存在的事物,可以是有形的(比如一辆汽车),也可以是无形的(比如一项计划),是构成世界的一个独立单位,具有静态特征(可以用某种数据来描述)和动态特征(对象所表现的行为或具有的功能)
- 面向对象方法中的对象:
是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位。对象由一组属性和一组行为构成。
属性:用来描述对象静态特征的数据项。
行为:用来描述对象动态特征的操作序列。
具体可以看看这篇文章
下面用一道编程题目来简单说明一下:
题目:在C++环境下,编写程序使其输入一个半径值,求这个半径对应的圆的面积?
2、采用结构化思想编程
程序如下:
#include "iostream"
using namespace std; //使用命名空间 std 标准的命名空间 (在这个命名空间中定义了很多标准定义)
int main()
{
double r;
double area;
cout << "请输入r:";
cin >> r;
area = 3.1415*r*r;
cout << "结果为:" << area << endl;
system("pause");
return 0;
}
这个程序里面,采用自顶向下结构,很清晰。
3、采用面向对象的思想编程
#include "iostream"
using namespace std;
/* 面向对象 */
class circle
{
public:
double g_r;
double pi = 3.1415;
double area;
public:
double getS() //求面积函数
{
area = pi*g_r*g_r;
return area;
}
};
int main()
{
circle r1; //新建一个类型为circle对象名为r1的对象
cout << "请输入r:";
cin >> r1.g_r;
cout << "结果为:" << r1.getS()<< endl;
system("pause");
r
通过以上两个程序的对比,所谓的面向的是对象,什么意思呢?
如上的题目中的参数,圆的半径和圆的面积,他们都属于圆的固有属性,具有1对多的特征,即一个圆,拥有半径、直径、周长、面积等等的属性,那么这个圆就可以被称作为一类事物class circle
,这个圆的名字r1
就叫做对象。
二、C++对C的加强
1、namespace命名空间
概念:namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
- 在C中的空间中:
C语言中只有一个全局作用域,所有的全局标识符共享同一个作用域,标识符之间可能发生冲突 。
- 在C++中的命名空间中:
为了解决以上冲突问题,C++中提出了命名空间的概念。将命名空间将全局作用域分成不同的部分,不同命名空间中的标识符可以同名而不会发生冲突,命名空间也可以相互嵌套。
1.1 自定义命名空间
使用方式:namespace+自定义命名空间名字{}
#include "iostream"
using namespace std;
/* 自定义命名空间 */
namespace NamespaceA
{
char a = 'A';
}
namespace NamespaceB
{
char a = 'B';
}
如何使用这个命名空间呢?
使用方式:using namespace+自定义命名空间名字
int main()
{
using namespace NamespaceA;
using namespace NamespaceB;
cout << NamespaceA::a << endl;
cout << NamespaceB::a << endl;
system("pause");
return 0;
}
1.2 命名空间相互嵌套
namespace NamespaceB
{
char a = 'B';
namespace NamespaceC
{
struct Teacher
{
char name[10] = "CC";
int age = 0 ;
};
}
}
如何使用这个命名空间呢?
使用方式(针对结构体):using 自定义命名空间名字::嵌套命名空间名字::结构体类型;
int main()
{
using NamespaceB::NamespaceC::Teacher;
Teacher t1;
//方法二:unsing NamespaceB::NamespaceC::Teacher t1;
cout << t1.name << endl;
system("pause");
return 0;
}
2、“实用性”增加
- 在C中必须要在作用域开始的位置定义变量
int main()
{
{ /* 正确 */
int i = 0;
int j = 1;
printf("%d",i);
printf("%d",j);
}
{ /* 错误 */
int i = 0;
printf("%d",i);
int j = 1;
printf("%d",j);
}
}
- 在C++中强调实用性,可以在需要使用时再定义
int main()
{
{ /* 正确 */
int i = 0;
printf("%d",i);
int j = 1;
printf("%d",j);
}
}
3、struct类型加强
- C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型
struct Teacher
{
char name[10];
int age;
};
当在main
函数中这样定义时Teacher t1;
会报错。正确:struct Teacher t1;
- C++中的struct是一个新类型的定义声明
struct Teacher
{
char name[10];
int age;
};
在main
函数允许这样定义:Teacher t1;
4、新增Bool类型关键字
bool名为布尔类型,可取的值只有true和false,理论上bool只占用一个字节。
- true代表真值,编译器内部用1来表示
- false代表非真值,编译器内部用0来表示
提问:那bool可以赋值吗?
回答:执行bool=2
,编译可以通过,但是bool输出值为1不为2。
执行bool=-2
,编译可以通过,但是bool输出值为1不为-2。
执行bool=0
,编译可以通过,但是bool输出值为0。
总结:bool赋值时将非0值转换为true,0值转换为false。
5、三目运算符的增强
- C语言中三目运算符返回的是:变量的值
如何证明?
证明:在C编译器中执行下列语句
int main()
{
int a = 10;
int b = 20;
(a>b? a:b) = 30
}
结果:会发现编译器报错。
原因:三目运算符返回的是变量的值,即执行(a>b? a:b)
得到的是b的值,20
。
- C++中三目运算符返回的是:变量本身
如何证明?
证明:在C++编译器中执行下列语句
int main()
{
int a = 10;
int b = 20;
(a>b? a:b) = 30
}
结果:会发现编译器成功。
原因:三目运算符返回的是变量本身,即执行(a>b? a:b)
得到的是变量b
,之后变量b赋值为30
。
提问:那么C++编译器是如何实现的呢?
回答:1、从C的角度去分析,相当于(a>b? &a:&b)
。
2、从C++的角度分析,相当于C++编译器手工去执行(a>b? &a:&b)
。
注意:上面所说的是从变量的角度,如果是(a>b? 1:2) = 30
,那么无论是C还是C++编译器,他们都会报错。
当然,对于C++对C的优化与升级远远不止上述介绍的那么少,通过后续的学习将逐渐完善。