首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++构造函数默认参数

c++构造函数默认参数
EN

Stack Overflow用户
提问于 2014-05-21 18:30:24
回答 4查看 3.5K关注 0票数 4

如何编写指定默认参数值的构造函数,

代码语言:javascript
复制
#include <iostream>

using namespace std;

struct foo
{
    char *_p;
    int   _q;

    foo( char *p = nullptr, int q = 0 ): _p(p), _q(q)
    {
        cout << "_q: " << _q << endl;
    }
};

然后使用它只传递一些值,而不考虑它们的顺序?

例如:这是有效的:

代码语言:javascript
复制
char tmp;
foo f( &tmp );

但这不是:

代码语言:javascript
复制
foo f( 1 );

$ g++ -O0 -g -Wall -std=c++0x -o test test.cpp
test.cpp: In function ‘int main(int, char**)’:
test.cpp:18:11: error: invalid conversion from ‘int’ to ‘char*’ [-fpermissive]
test.cpp:10:2: error:   initializing argument 1 of ‘foo::foo(char*, int)’ [-fpermissive]
EN

回答 4

Stack Overflow用户

发布于 2014-05-21 18:35:05

简而言之,您不能忽略订单。

但是,您可以创建多个构造函数。

代码语言:javascript
复制
struct foo
{
    char *_p;
    int   _q;

    foo( char *p, int q): _p(p), _q(q) {}
    foo( char *p): _p(p), _q(0) {}
    foo( int q): _p(nullptr), _q(q) {}
};

编辑:

顺便说一句,将顺序设置为可变/可忽略并不总是一个好主意。这有时会导致模棱两可或难以找到/调试的意外行为。在我的示例中,使用NULL参数调用会导致像here这样的歧义

代码语言:javascript
复制
class foo {
public:
    foo(int x, unsigned char y=0) : x_(x), y_(y) {}
    foo(unsigned char x, int y=0) : x_(y), y_(x) {}

    int  x_;
    char y_;
};

作为提示,请改用定义明确的构造函数/函数重载。

票数 2
EN

Stack Overflow用户

发布于 2014-05-21 21:13:49

有一个命名的参数习惯用法。它允许通过指定参数的名称以任何顺序传递参数。它还允许将某些参数保留为默认值,并在一条语句中仅设置选定的参数。使用示例:

代码语言:javascript
复制
File f = OpenFile("foo.txt")
       .readonly()
       .createIfNotExist()
       .appendWhenWriting()
       .blockSize(1024)
       .unbuffered()
       .exclusiveAccess();

习惯用法描述和File实现细节可在http://www.parashift.com/c++-faq/named-parameter-idiom.html上获得

票数 2
EN

Stack Overflow用户

发布于 2014-05-21 18:48:40

在C++中,没有办法忽略参数顺序。不过,您可以只使用函数重载和委托构造函数:

代码语言:javascript
复制
struct foo {
    char *_p;
    int   _q;
    // this is the default constructor and can also be used for conversion
    foo( char *p = nullptr, int q = 0 ): _p(p), _q(q)
    {
        cout << "_q: " << _q << endl;
    }
    // this constructor canbe used for conversion.
    foo( int q, char *p = nullptr): foo(p, q) {}
};

另外,考虑添加explicit以避免使用构造函数进行隐式转换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23780590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档