【学习笔记】C++再入门过程-1

c++概述

C++是面向对象的编程,同时也是一种泛型编程。
面向过程是一种以过程为中心的编程思想,通过分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向过程编程思想的核心:功能分解,自顶向下,逐层细化(程序=数据结构+算法)。面向过程的编程语言存在的主要缺点是不符合人的思维习惯,而是要用计算机的思维方式去处理问题,而且面向过程编程语言重用性低,维护困难。
面向对象的编程(Object-Oriented Programming)简称OOP技术,常常使用许多代码模块,每个模块都只提供特定的功能,它们是彼此独立的,这样就增大了代码重用的几率,更加有利于软件的开发、维护和升级。在面向对象的开发过程中,算法与数据结构倍看作是一个整体,称为对象梦想是世界中任何类的对象都具有一定的属性和操作,也总能用数据结构与算法两者合一地描述,所以可以用下面的等式来定义对象和程序:对象=算法+数据结构 程序=对象+对象+…
面向对象编程思想的核心:应对变化,提高复用。

c++的三大特性

封装:把客观的事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。类将成员变量和成员函数封装在类的内部,根据需要设置访问权限,通过成员函数管理内部状态。数据->成员数据,方法->成员函数。
继承:继承所表达的是类之间相关的关系,这种关系使得对象可以继承另外一类对象的特征和能力。继承的作用在于,避免公用代码的重复开发,减少代码和数据冗余。
多态:多态性可以简单地概括为“一个接口,多种方法”,字面意思为多种形态。程序在运行时才决定调用的的函数,它是面向对象编程领域的核心概念。

c++对c的扩展

1.作用域运算::

通常情况下,如果有两个同名变量,一个是全局变量,另一个是局部变量,那么局部变量在其作用域内具有较高的优先权,它将屏蔽全局变量。作用域可以解决局部变量和全局变量的重名问题。
eg.

// 作用域举例
int a=10;
void test(){
	//局部变量
	int a=20;
	//全局a被隐藏
	cout<<"a="<<a<<endl;//a=10
	cout<<"a="<<::a<<endl;//a=20
}

2.名字控制

创建名字是程序设计过程中一项最基本的活动,当一个项目很大时,它不可避免的包含大量的名字。c++允许我们对名字的产生和名字的可见进行控制。之前在学习c语言可以通过static关键字来使名字在本编译单元内可见,在c++中我们将通过一定通过命名空间来控制对名字的访问。
2.1 命名空间(namespace)
在c++中,名称(name)可以是符号常量、变量、函数、结构、枚举、类和对象等等。工程越大,名称互相冲突的可能性越大。在使用不同厂商的类库时,也可能导致名称冲突。为了避免,在大规模程序设计中标识符命名发生冲突,标准c++引入关键字namespace,可以更好地控制标识符的作用域。
2.2 定义

// 命名空间
namespace A{
	int data_1 = 10;
}
namespace B{
	int data_1 = 20;
}
void test(){
	cout<<"data_1"<<A::data_1<<endl;
	cout<<"datd_1"<<B::data_1<<endl;
}

2.3 注意
①命名空间只能在全局进行定义
②命名空间可以嵌套命名空间,A::B::变量
③命名空间是开放的,可以随时把新的成员加入已有的命名空间中

// ③
namespace A{
	int a = 10;
}
...//1000行之后
namespace A{
	int b = 9;
}//此时,A不算重新定义,而是表示空间A中新增了成员b,合并

2.4 声明和实现可以分离

// 分离
namespace B{
	int a = 10;
	int get_a(void);
}
int C::get_a(void){
	return a;
}//命名空间的方法可以在空间之外定义,但是需要在方法之前加上空间名称

2.5 无命名空间
意味着明明空间中的标识符只能在本文件中访问,相当于给这个标识符加上了static,使得其可以作为内部连接。
2.6 命名空间别名

// An highlighted block
namespace verylongname{
	int a = 10;
	void func(){ cout<<"hello namspace"<<endl'}
}
void test(){
	namespace shortName = verylongname;//赋值运算符
	cout << "verylongname::a:"<<shortname::a<<endl;
	verylongname::func();
	shortName::func();
}

2.7 using是修饰 命令空间 内部的某些数据和方法

// An highlighted block
namespace D{
	int a =10;
}
void test04(){
	using D::a;//此处的a来自D命名空间
	//但是不排除会出现同名情况
	int a = 20;//此处又定义了一个a
	cout<<"a="<<a<<endl;//此处将报错,不知道访问哪个a
}

2.8 using声明碰到函数重载

// 体现了C++的多态性
namespace A{
	void func(){}
	void func(int x){}
	void func(int x, int y){}
}
void test(){
	using A::func();
	func();
	func(10);
	func(10,20);
}

如果命名空间包含一组相同名字重载的函数,using声明就声明可这个重载函数的所有集合。
2.9 using是修饰整个命名空间

// An highlighted block
namespace D {
	int a = 10;
	int b = 20;
	int c = 30;
}
void test(){
	using D::a;
	using D::b;
	using D::c;//太麻烦了,为了避免麻烦,采用下面方式直接声明整个命名空间
	using namespace D;//此处需要加namespace,强调命名空间,和2.7强调命名空间内的数据和方法不同,此处先查看当前普通变量a,如果没有,再查看命名空间中有没有a
}

3 增强

3.1 全局变量增强

// 告诉用户严谨定义
int a = 10;//赋值,当做定义
int a;//没有赋值,当做声明
int main(){
	printf("a:%d\n",a);
	return 0;
}//此代码在c++下编译失败,在c下编译通过,原因在于c++编译要求更严谨,这里a既定义又声明,不符合编译标准。

3.2 类型增强
c++中所有的变量和函数都必须有类型。在C语言中,函数声明中没有说明其中的参数是什么类型,则可以是任意类型;没有写参数,代表可以传任意类型的实参。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值