C++基礎①命名空間結構體和引用

接續【C語言基礎系列】ios

前言

在進行NDK開發的時候 , 咱們使用的不少第三方庫 , 大多數都是使用的C/C++編寫的 , 有些多是C和C++混編的 。如,我在NDK系列中提到的增量更新使用的兩個庫 bsdiffbzip2 。那麼 , 咱們在學完C語言以後 , 有必要研究一下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;
			}
		};
	}
}

使用namespacethis

// 標準命名空間 (包含不少標準的定義)
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標準函數 。spa

C++ 類 與 結構體

C++是面嚮對象語言 , 面嚮對象語言的一大特徵就是能夠將類型整合起來 , 能夠建立類型實例 。指針

建立C++類code

/*
	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++仍是很容易上手的 , 基礎語法 , 須要動手練 , 多作實驗 , 慢慢就會熟能生巧 。

相關文章
相關標籤/搜索