c++基础(const关键词, 命名空间, 引用, 内联函数)


title: c++基础(const关键词, 命名空间, 引用, 内联函数)
date: 2018-09-11 18:09:01
tags:


正好这学期在学c++, 打算把自己学习的都记录一下.

这篇文章主要是c++中的一些不同于c的特性.

const关键词

const通常用来表示常量,主要有以下一些用法:

符号常量

const type V = value表示V是一个常量.

在c语言中常量可以用宏定义, 如#define PI 3.14. 这种方式在编译时把代码中的PI全都替换为3.14, 就是说PI这个常量是没有被保存在内存中的. 而用cosnt定义的变量会保存在内存的常量区.

修饰函数形参

用cosnt修饰的形参在函数指向过程中不能被修改.

int func(const int a) {
//    a++;//error
    return a + 5;
}

当一个函数的功能明确不能或者不需要修改参数时可以用cosnt修饰该参数.

修饰指针变量

const修饰指针变量有以下三种情况:

指向常量的指针

指向常量的指针, 也可以指向变量, 但是指针认为它指向了常量, 所以不能通过指针修改.

    cosnt int a = 10;
    int b = 11;
    const int *p_a = &a;//a是常量
    const int *p_b = &b;//ok, 指向常量的指针也能指向变量
//    *p_a = 5;//error
//    *p_b = 6;//error虽然指向变量, 但是不能通过指针修改

常指针

指针变量是个常量, 必须初始化. 不能指向常量(常量只能被指向常量的指针指向), 可以通过指针修改. 其实就相当于一个普通指针, 但是赋初值后不能修改指向的地址.

//    int *const p = &a;//error
//    不能指向常量
    int *const p = &b;
    *p = 20;//ok
//    p = &a;//error
//    不能被修改

类中的this指针就是个常指针, 只能指向当前对象.

指向常量的常指针

只能指向常量, 而且本身是个常量, 是前两者的结合体.

//      c 指向常量的常指针 什么都不能改
    const int *const p_c = &a;

命名空间(namespace)

namespace可以用来区别不同文件里的相同名称的函数, 变量等.

namespace first_space {
    int a = 10;

    int func(const int a);
//    嵌套namespace
    namespace second_space {
        int b = 11;
    }
}

//不连续命名空间
namespace first_space {
//    int a = 10;//error
    int b = 12;
}

//对命名空间中函数的实现
int first_space::func(const int a) {
    return a + 10;
}

要使用命名空间中的成员, 需要使用::运算符, 如first_space::a.

可以用using namespace space_name;来表示使用的命名空间, 这样可以省略命名空间, 比如要使用c++的标准库, 一般会using namespace std;.

引用(reference)

引用相当于给变量取个别名.

int e = 10;
int &f = e;
cout << e << endl;
f = 11;
cout << e << endl;

这里f相当于是e的一个别名, 修改两者中的任何一个, 另一个会跟着一起改变.

按引用传参

c++的默认传参方式是按值传参, 实参的值会被复制到形参中.

而按引用传参不会复制, 而是直接引用实参, 不过会给实参取一个别名.

void add_five(int &a) {
    a += 5;
}

其实大多数编程语言都是默认都是按值调用(call by value), 比如对于java来说只有call by value, 而c++有两种参数传递方式: 按值调用(call by value), 按引用调用(call by reference).

指针传递

c++传递指针作为参数, 还是call by value

void func(int *p) {
    *p = 10;//通过指针可以修改指向的值
    p = NULL;//但是调用处的指针变量不会因为p变成NULL也变成NULL
    //因为调用处把传递的指针的值复制一份给了p, 修改p不会改变原来指针的值
}

java call by reference?

java中的对象变量储存的是对象的应用, 那么把对象变量作为参数传递是call by reference吗? 事实上, 这还是call by value, 不过传递的是引用的备份, 类似于c/c++中传递指针.

public static void swap(Object a, Object b) {//doesn't work
    Object temp = a;
    a = b;
    b = a;
}
//call
swap(a, b);

调用swap函数处a, b的值并没有变化, 因为函数中只是a, b引用的备份, 并非调用处a, b. 而正真的call by reference 是可以改变调用处实参的值.

void swap(int &a, int &b) {
    int temp = a;
    a = b;
    b = a;
}
//call
int a = 4, b = 5;
swap(a, b);
//a = 5, b =4

好像很多人都没有搞清楚call by reference, 事实上call by reference只存在少数编程语言中. 虽然有时它的应用会简化程序, 不过个人认为call by value更加符合程序设计原则(不负责任偏激的见解).

修饰函数返回值

这是个有点变态的操作, 暂时没有搞懂有什么神奇操作

int &fn(int &b) {
    return b;
}
//main
int n = 9;
fn(n) = 11;
//此时n=11

是不是很变态, 我第一看到也一脸懵逼.

内联函数(inline)

内联函数, 这是一个很实用的特性. 内联函数并不会真的被调用, 简单来说就是把函数的语句直接复制到执行的地方执行, 但是又不是像宏无脑的替换. 对于一些经常调用的函数, 这样可以减少函数调用的开销.

inline int max(int a, int b) {
    return a > b ? a : b;
}

//main
int a = 10, b = 20;
int c = max(++a, --b);
//c = 19

调用max的地方语句会被这样替换:

++a;
--b;
int c = a > b ? a : b;

对比以下宏定义的方式:

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