C++基础 001 C到C++的过渡

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值转换为true0值转换为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的优化与升级远远不止上述介绍的那么少,通过后续的学习将逐渐完善。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值