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

接续【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++还是很容易上手的 , 基础语法 , 需要动手练 , 多做实验 , 慢慢就会熟能生巧 。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容