[进阶]C++:数组形参

使用表准库规范

#include <iostream>
using namespace std;
namespace print
{
    void Print(const int* a, const int* b)
    {
        while (a != b)
        {
            std::cout << *a++ << std::endl;

        }
    }
    void Print(const int* a, const size_t b)
    {
        for (size_t i = 0; i < b; i++)
        {
            cout << a[i] << endl;
        }
    }
}
int main()
{
    std::cout << "Hello World!\n";
    int j[2] = { 0,1 };
    print::Print(begin(j), end(j));//用到了标准库
    print::Print(j, end(j)-begin(j));//用到了标准库
}

传递多维数组

  • C++语言中实际上没有真正的多维数组,多为的多维数组实际上是数组的数组
void print (int max[][10],int rowSize){}

等价定义

void Print (int(*max)[10], int rowSize) {}

main:处理命令行选项

int main(int argc,char *argv[]){}

第二个形参argv是一个数组,它的原属是指向C风格的字符串指针,第一个形参argc表示数组中字符串的数量。也可以写成如下形式

int main(int argc,char **argv){}

当实参传递给main后,第一个元素指向程序的名字或者空字符串
之后传递命令行提供的参数

prog -d -o oflie data0
argv[0]="prog";
argv[1]="-d";
argv[2]="-o";
argv[3]="ofile";
argv[4]="data0";
argv[5]="0";

含有可变形参的函数

有时我们无法提前预知应该向函数传递几个实参。如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型;如果类型不同,可以编写一个特殊的函数,以后会讲到

  • initializer_list形参
    如果函数的实参数量未知,但是所有的类型相同。
void Error_Msg(initializer_list<string> il)
{
    for (auto beg = il.begin(); beg < il.end(); beg++)
    {
        cout << *beg << "";
        cout << endl;
    }
}
int main()
{
    std::cout << "Hello World!\n";
    Error_Msg({ "H","s","v" });//三个参数
    Error_Msg({ "R","G" });//两个参数
}

省略符参数

  • 省略符参数有两种形式:
void foo(parm_list,...)
void foo(...)

第一种形式指定了foo函数的部分形参的类型

返回类型

  • 不要返回局部对象的引用或指针
const string& mainip()
{
    string ret;
    if (!ret.empty())
    {
        return ret;//错误。返回局部对象的引用
    }
    else
    {
        return "Empty";//错误,返回一个局部临时变量
    }
}
int main()
{
    std::cout << "Hello World!\n";
    cout<<mainip()<<endl;
}

对于第一个return,显然它返回的是一个局部变量。第二个return中,字符串字面值转换成了一个局部临时变量,该对象和ret一样是局部的。

  • 引用返回左值
    调用一个引用的函数得到左值,其他返回类型得到右值。
char& get_val(string& str, string::size_type ix)
{
    return str[ix];
}
int main()
{
    std::cout << "Hello World!\n";
    string s("a value");
    cout << s << endl;//输出a value
    get_val(s, 0) = 'A';//将s[0]改成A
    cout << s << endl;//输出A value

}

列表初始化返回

  • 根据C++11的新规定,函数可以返回花括号包围的值的列表
vector<string> process()
{
    return{"a","b"};
}

返回数组指针

  • 因为数组不能被拷贝,所以不能返回数组。不过可以返回数组的指针或引用。
typedef int arrt[10];
arrt* func(int i);//func返回一个指向含有10个整数的数组的指针
  • 声明一个返回数组指针的函数
int arr[10];//arr是一个含有10个整数的数组
int *p1[10];//p1是一个含有10个指针的数组
int(*p2)[10]=&arr;//p2是一个指针,他指向含有10个整数的数组
  • 如果我们想定义一个返回数组指针的函数,则数组的维度必须跟在函数名字之后。举个例子:
int (*func(int i)) [10];//

( * func ( int i ) )表示我们能对函数调用的结果执行解引用操作
( * func ( int i ) )[10]表示解引用func的调用将得到一个大小是10的数组。

  • 也可以使用尾置返回类型。
auto func(int i)->int(*)[10];
//func接受一个int类型的实参,返回一个指针,该指针指向一个含有10个整数的数组

使用decltype

  • 如果我们知道返回的指针指向那个指针,就可以使用decltype关键字声明返回类型。
int odd[]={1,2,3,4};
int even[]={5,6,7,8};
decltype(odd) *arrPtr(int i)
{
  return (i%2)? &odd:&even;
//返回一个指向数组的指针
}

参考:C++primer 第五版

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

推荐阅读更多精彩内容