困扰我的c++语法
以下是我上周学习c++ primer的心得:
1 数组引用作为形参
c++允许将变量定义成数组的引用,以下列代码为例。形参为int (&arr)[10],该参数需分成两部分说明,引用名和
引用定义。
- 引用名arr和&结合,表示其是一个引用
- 和下标运算符结合,表示其是一个数组的引用
- 和int结合,表示其是一个int型数组的引用
值得注意的是,括号是必不可少的,否则形参就会变成一个整型引用数组
void print( int (&arr)[10] )
{
for (auto elem : arr)
cout << elem << endl;
}
2 声明一个返回数组指针的函数
我们知道如何声明并初始化一个指向数组的指针:
int a[10];
int (*p)[10];
p = a;
但是如何去声明一个返回数组指针的函数呢,形式如下:
Type ( *function(parameter_list) )[dimension]
Type表示数组元素的类型,dimension是返回数组的维数https://www.zhihu.com/question/27860418
实例:
int ( *func(int i) ) [10];
- 函数名和形参是func(int i)
- 和 * 结合表示函数返回一个指针类型
- 和下标运算符结合表示其是指向数组的指针
- 和int结合表示其返回一个指向int型数组的指针
定义一个返回数组指针的函数:
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int odd[] = {1, 3, 5, 7, 9};
int even[] = {0, 2, 4, 6, 8};
int (*arrptr( int i ))[5]
{
return (i % 2) ? &odd : &even;
}
int main(void)
{
int (*p)[5];
p = arrptr(2);
for (int i = 0; i < 5; i++)
cout << p[0][i] << endl;
return 0;
}
3 const成员函数
int func(void) const { }类似这种将const放在形参列表之后的函数被称为const成员函数。
在说明const成员函数之前,我们要先说说this指针。
每个成员函数都包含一个隐式参数this,this指向该函数所对应的对象,默认的this指针的类型是一个常量指针(顶层const)并且指向非常量对象。无论我们使用诸如this.func()或者obj.func()(obj是具体的对象名),编译器都会将
obj的地址传递给func的隐式参数this。但是由于this是一个指向非常量对象的指针,所以我们不能使用this去绑定一个常量对象。类似的,常量对象也不能调用普通的成员函数。举个栗子,
class FooClass {
public:
void foo(){};
}
int main(void)
{
const FooClass a;
a.foo();
}
在编译a.foo()时,编译器使用a的地址去初始化foo的隐式参数this,但是,这里的this指向的是一个非常量对象,所以无法绑定到对象a上去,因此 a.foo(); 是一条非法语句。只要将this转换成const FooClass *const 类型就可以实现本次调用。通过将函数foo声明为一个const成员函数就可以实现这一点。修改代码如下:
class FooClass {
public:
void foo() const{};
}
int main(void)
{
const FooClass a;
a.foo();
}
值得注意的是,const成员函数不能修改对象内的成员变量。
参考
C++ primer 5th edition
https://www.zhihu.com/question/52468516?from=profile_question_card
https://www.zhihu.com/question/27860418
困扰我的c++语法的更多相关文章
- Google C++单元测试框架GoogleTest---Google Mock简介--概念及基础语法
就在昨天终于做了gtest的分享,我的预研工作终于结束了,感觉离我辞职的日子不远了,毕竟是专注java二百年啊,要告别实习啦.. 这篇是GoogleMock的简介文档,会在后边附带一个自己的例子. 一 ...
- 简体中国版文档的Markdown语法
Markdown文件 注意︰这是简体中国版文档的Markdown语法.如果你正在寻找英语版文档.请参阅Markdown︰ Markdown: Syntax. Markdown: Syntax 概述 哲 ...
- Swift3.0P1 语法指南——属性
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- Markdown语法说明(详解版)
####date: 2016-05-26 20:38:58 tags: Markdown tags && Syntax ##Markdown语法说明(详解版)杨帆发表于 2011-11 ...
- java基础语法要点<二>(基于1.8)
注解(元数据) 从jdk5 开始,java支持在源文件中嵌入补充信息,称为注释(annotation).注释不会改变程序的动作,也就不会改变程序的语义.但在开发和部署期间,各种工具可以使用这类信息.元 ...
- Swift语法基础入门四(构造函数, 懒加载)
Swift语法基础入门四(构造函数, 懒加载) 存储属性 具备存储功能, 和OC中普通属性一样 // Swfit要求我们在创建对象时必须给所有的属性初始化 // 如果没办法保证在构造方法中初始化属性, ...
- Smali文件语法解析
大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄鱼小顽皮APK能看到的是(Google Play下载的完整版版 ...
- [转]smail语法 详解
大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄鱼小顽皮APK能看到的是(Google Play下载的完整版版 ...
- 10.1 ES6 的新增特性以及简单语法
ES6 的新增特性以及简单语法 let 和 const 模板字符串 箭头函数 对象单体模式 es6面向对象 模块化 let 和 const 之前一直用 var 来声明变量,ES6 新增 let 和 ...
随机推荐
- hibernate事务管理 (jdbc jta)
hibernate的两种事务管理jdbc 和jta方式.下边说说两者的区别一.说明一下jdbc和jta方式事务管理的区别:JDBC事务由Connnection管理,也就是说,事务管理实际上是在JDBC ...
- owin解决跨域js请求
最近在用owin打了一个建议的http的api服务,但遇到了js跨域访问的问题,后来在网上找到了答案,已帮助遇到此问题的人 1.首先nuget先按着owin依赖的包,然后至关重要的一步是引用Micro ...
- sql:无法解决 equal to 操作中 "Chinese_PRC_CI_AS" 和 "Chinese_Taiwan_Stroke_CI_AS" 之间的排序规则冲突。
--无法解决 equal to 操作中 "Chinese_PRC_CI_AS" 和 "Chinese_Taiwan_Stroke_CI_AS" 之间的排序规则冲 ...
- 常用DOM结构方法总结
---内容开始--- 获取元素的方法: getElementById() 通过ID名获取元素 getElementsByTagName() 通过元素(标签)名称 getElementsByClassN ...
- 我的SublimeText配置
我的SublimeText改键 [ /** * 我的改键 */ // f1控制中心:f2快速查找:f3查找下一个: { "keys": ["f1"], &quo ...
- 数据质量控制软件Q-CHECKER(转)
随着企业信息化建设的不断深入进行,我们的企业将逐步地发展成为数字化企业.其中作为最基本构成的CATIA数模已经是产品开发制造的唯一依据,CATIA数模的质量就是加工的质量,就是制造的质量,就是生产出的 ...
- 再学UML-UML用例建模解析(三)
2. 编写用例文档 绘制用例图只是完成了用例建模最基本也是最简单的一步,用例建模的核心在于编写用例文档,用例文档又称为用例规约或用例描述.顾名思义,用例文档是用于描述用例的文档,每一个用例对应于一个用 ...
- 时间序列算法理论及python实现(2-python实现)
如果你在寻找时间序列是什么?如何实现时间序列?那么请看这篇博客,将以通俗易懂的语言,全面的阐述时间序列及其python实现. 时间序列算法理论详见我的另一篇博客:时间序列算法理论及python实现 - ...
- 学习和运用scrum
作为长大的大三老腊肉,我们已经在长大生活了两年多,对于什么是长大人最想完善的校园需求.最想拥有的校园服务媒介也有了更加深切的体会. 于是,GoodJob小团队blingbling闪现啦!! GoodJ ...
- 西汉姆VS利物浦,铁锤『拳』出击,打回原『菱』形
一.铁锤,还是铁桶? 铁锤帮西汉姆今晚摆出4-2-3-1对阵红军利物浦的4-3-3 ,阿勒戴斯曾在主场2-1战胜赫尔城时被球迷嘘,嫌他的足球太过丑陋『2010年的时候贝尼特斯也曾经诟病阿勒戴斯带队 ...