2016-09-22 524 views
-2

我在想,如果在C++中的变量的重新定义是可能的,例如:C++重新定义目标变量,

void some_function(int some_argument) { 
    float some_argument=(float) some_argument; 
    // Do stuff 
    return some_argument; 
} 

是否有某种方式来做到这一点?我知道你可以更改名称,但如果名称相同,则名称会更清晰。如果没有,是否有某些原因不包括此功能?

在此先感谢。

+2

您可以将它称为遮蔽,但不能在初始化程序中使用旧的定义。 (它会使用新的。) – pmdj

+0

你是什么意思这么清洁?只要给它一个新的名字并忽略函数参数。 – NathanOliver

+0

为什么不只是使用参数,如果你想暂时存储它,然后做一个,如果你这样做,你会如何参考原始的? – xinaiz

回答

1

有没有办法做到这一点?

您可以创建一个新的作用域并定义一个名称与该函数参数名称相同的新变量。

void some_function(int some_argument) { 
    { 
     float some_argument = 0; 
     // Do stuff 
    } 
} 

但是,你不能使用:

void some_function(int some_argument) { 
    { 
     float some_argument = (float)some_argument; 
     // Do stuff 
    } 
} 

在第二种情况下,初始化不使用函数参数初始化阴影变量。它是那么糟糕,因为

int i = i; 

通过避免所有这些麻烦:

  1. 的变量和参数使用不同的名字。

    void some_function(int some_argument_in) { 
        float some_argument = (float)some_argument_in; 
        // Do stuff 
    } 
    
  2. 使用函数过载。

    void some_function(float some_argument) { 
        // Do stuff 
    } 
    
    void some_function(int some_argument) { 
        some_function((float)some_argument); 
    } 
    
+0

很好的答案。是否有一些原因变量阴影不能使用以前的值?是否有一个原因不能在同一个范围内完成遮蔽?我喜欢超载,这是迄今为止最干净的。如果我经常调用函数,超载会影响性能吗?非常感谢。 – negamartin

0

下面给出了关于可能的数据丢失intfloat之间进行转换时警告,但它演示了如何传递变量为一个类型和它的功能在其他作品:

float some_function(int some_argument) { 
    // Do stuff 
    return some_argument; 
} 

int main() 
{ 
    float oldval = 3; 
    float newval = some_function(oldval); 
    return 0; 
} 
+0

这是可以的,当新的类型可以被隐式地转换时,这不是我的情况。对不起,我没有在这个问题中提及。 – negamartin

+0

您可以添加[用户定义的转换](http://en.cppreference。com/w/cpp/language/cast_operator)来保持这个和其他函数的代码清洁。 – wally

+0

哦,这也是一种很好的方式,但它会污染功能的外部环境。 – negamartin