文档章节

C++基础①命名空间结构体和引用

逝我
 逝我
发布于 2016/09/22 10:41
字数 1258
阅读 318
收藏 2

接续【C语言基础系列】

前言

在进行NDK开发的时候 , 我们使用的很多第三方库 , 大多数都是使用的C/C++编写的 , 有些可能是C和C++混编的 。如,我在NDK系列中提到的增量更新使用的两个库 bsdiffbzip2 。那么 , 我们在学完C语言之后 , 有必要研究一下C++,因为C++是C的拓展 , 加入了面向对象和模板技术 ,那么基本语法就不用介绍了。本系列假定你具有一定的编程经验,对面向对象有一定的了解 。

命名空间

在Java中 , 我们使用包来区分文件的所在路径和类来自哪个包 ,使用package来声明文件在哪个文件目录下 , 进而在使用的时候可以区分 , 来自不同的包的相同类名 。在C++里面没有package关键字 , 而是使用namespace来作为区分 , 在PHP中也是如此 , 在PHP5.0的时候引入的了namespace来做为区分不同路径下的同名函数和类 。

定义namespace

  /*
	cpp namespace demo
*/

#include <iostream>

/*
	自定义命名空间 , 相当于Java中的包 。
	命名空间可以嵌套
*/
namespace NSP_A
{
	class A {
	public:
		void sayHello() {
			std::cout << "say Hello " << std::endl;
		}
	};

	// 嵌套namespace
	namespace NSP_A_1
	{
		class A {
		public:
			void sayHello() {
				std::cout << "Say Hello 1" << std::endl;
			}
		};
	}
}

使用namespace

// 标准命名空间 (包含很多标准的定义)
using namespace std;

// use namespace
using namespace NSP_A;


/*
	使用自定义命名空间
*/
void useNameSpace() {

	A a; 
	a.sayHello();

	// 嵌套命名空间使用
	NSP_A_1::A a2;
	a2.sayHello();

}

在C++中也定义了一些标准命名空间 , 如std ,C++中也兼容C语言语法 , 可以引入C语言头文件,使用C标准函数 。

C++ 类 与 结构体

C++是面向对象语言 , 面向对象语言的一大特征就是可以将类型整合起来 , 可以创建类型实例 。

创建C++类

/*
	cpp class type
*/

#include <iostream>

using namespace std;

namespace CPP_CLASS
{
	class Animal {
	// C++ 共用权限访问修饰符
	private:
		char* name;
		int age;
	public:
		void setName(char* name) {
			this->name = name;
		}
		void setAge(int age) {
			this->age = age;
		}

		void showInfo() {
			cout << "名称:" << this->name << " 年岁:" << this->age << endl;
		}
	};
}

写法都是类似的 , C++字段和函数都是采用的共享权限修饰符 , 值得注意的是 , 在C++中 , 结构体里面的属性和函数也具有权限访问修饰符 。

/*
	CPP Struct
*/
namespace CPP_STRUCT
{
	// C++结构体与C结构不同之处在于 , 在C++中结构体内字段函数可以有权限修饰符,用法和类用法一致
	// 和类不同的是 , struct 不能继承
	struct Person
	{
	private:
		char* name;
		int age;
	public:
		void setName(char* name) {
			this->name = name;
		}
		void setAge(int age) {
			this->age = age;
		}

		void showPersonInfo() {
			cout << "姓名: " << this->name << "  年龄: " << this->age << endl;
		}
	};
}

结构体和类最大的不同是 , 结构体不能继承 , 不能进行抽象化。

使用C++类 与 结构体


/* CPP Class */
using namespace CPP_CLASS;

/* CPP Struct */
using namespace CPP_STRUCT;

/*
	Simple CPP Class
*/
void useCppClass() {

	Animal animal;
	animal.setName("dog");
	animal.setAge(2);

	animal.showInfo();

}

/*
	C and C++ 结构体的区别
*/
void useCppStruct() {

	Person p;
	p.setName("zeno");
	p.setAge(20);

	p.showPersonInfo();

}

在C++中 , 使用类与使用结构体 , 用法并无二致 , 只是结构不能使用new而类可以使用 , new出来的是一个对象指针 。

引用

相信大家对引用并不陌生 , 在Java中 , 我们常常将对象变量叫做对象引用 , 在C++中也不例外 , C++中的引用也可以作为对象变量 , 但C++中的引用不会开辟新的空间 , 去存储指向对象内存空间的地址值 , 而是作为对象引用的一个别名 。

简单示意图

引用

引用示例

/*
	CPP 引用 
*/

#include <iostream>

namespace CPP_QUOTE {

	class Quote {
	public:
		int x = 10;

		// 引用 ,就是传入变量的别名,引用不会开辟新的内存空间,如同指针一样,指向的是传入变量的内存空间
		// 一般作为函数参数或返回值
		// 引用使用方便
		void swip(int &a, int &b) {
			int c = 0;
			c = a;
			a = b;
			b = c;
		}

		// 指针交换
		void swip_p(int* a , int* b) {
			int c = 0; 
			c = *a;
			*a = *b;
			*b = c;
		}
	};

}

引用在函数传值的时候, 可以当指针来使用 , 引用最广泛的用途就在于 , 在函数参数中 , 充当指针用 。

引用使用


/* C++ 引用的使用 */
/* CPP Quote */
using namespace CPP_QUOTE;

void useCppQuote() {

	Quote q;
	// Quote q 的别名
	Quote &q1 = q;

	q1.x = 100;

	printf("q的内存地址 : %#x , q1的内存地址:%#x\n", &q, &q1);

	cout << " q == " << q.x << endl;

	int x = 20, y = 40;

	q1.swip(x, y);

	cout << " q swipe  x = " << x << "  y = " << y << endl;

	// 指针值交换
	q1.swip_p(&x, &y);

	cout << " 指针值交换 :   x = " << x << "  y = " << y << endl;
}

打印对象的地址与引用变量的地址 , 我们会发现内存地址是一致 , 因为引用是变量的别名 , 不会创建新的内存空间。

结语

有了C语言基础 , 学C++ , 只要掌握语法的差异性和一些C++的特性 , C++还是很容易上手的 , 基础语法 , 需要动手练 , 多做实验 , 慢慢就会熟能生巧 。

© 著作权归作者所有

逝我
粉丝 4
博文 20
码字总数 31426
作品 0
长沙
程序员
私信 提问
C++基础教程之C/C++区别

C/C++基础教程之C/C++区别 这是C++教程得第一步,后续会持续更新哦!欢迎新手(具有C基础),老鸟可绕道,可指导。 C++标准输入和输出 C++标准输入和输出分别是cin和cout,用法非常简单 cin>>n...

这个人很懒什么都没留下
2018/09/01
0
0
一个C#开发者重温C++的心路历程

前言 这是一篇C#开发重新学习C++的体验文章。 作为一个C#开发为什么要重新学习C++呢?因为在C#在很多业务场景需要调用一些C++编写的COM组件,如果不了解C++,那么,很容易注定是要被C++同事忽...

kiba518
05/20
0
0
4-C++远征之起航篇-学习笔记

c++教程起航篇 我们会讲C++那些事,C++与C语言的关系。 C++诞生于贝尔实验室。 C++之父: 本贾尼·斯特劳斯特卢普 C++社区排行榜 最新排行,c++排名第三,Python排名第四 C++语言的应用领域:...

天涯明月笙
2018/07/20
0
0
Thrift学习笔记—IDL基本类型

原文地址:http://zhwen.org/xlog/?p=658 thrift 采用IDL(Interface Definition Language)来定义通用的服务接口,并通过生成不同的语言代理实现来达到跨语言、平台的功能。在thrift的IDL中...

helight
2014/01/22
15K
0
C语言/C++程序员编程学习—基本字符集

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
2018/03/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
5
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部