October 23, 2014 Constructor params with same name as members | ||||
---|---|---|---|---|
| ||||
Hello. Please see the following code:
import std.stdio ;
struct Pair {
int x, y ;
this (int x, int y) { x = x ; y = y ; }
}
void main() {
auto P = Pair(1, 2) ;
writeln(P.x, ' ', P.y) ;
}
This outputs 0 0, whereas the equivalent C++ code outputs 1 2 correctly:
# include <iostream>
struct Pair {
int x, y ;
Pair(int x, int y) : x(x), y(y) {}
} ;
int main() {
auto P = Pair(1, 2) ;
std::cout << P.x << ' ' << P.y << std::endl ;
}
It seems to me that D should either not permit argument names to shadow the member names, since it has no initializer lists and all members are automatically initialized. Comments?
--
Shriramana Sharma ஶ்ரீரமணஶர்மா श्रीरमणशर्मा
|
October 23, 2014 Re: Constructor params with same name as members | ||||
---|---|---|---|---|
| ||||
Posted in reply to Shriramana Sharma | On 10/23/14 1:03 AM, Shriramana Sharma via Digitalmars-d-learn wrote: > Hello. Please see the following code: > > import std.stdio ; > struct Pair { > int x, y ; > this (int x, int y) { x = x ; y = y ; } > } > void main() { > auto P = Pair(1, 2) ; > writeln(P.x, ' ', P.y) ; > } > > This outputs 0 0, whereas the equivalent C++ code outputs 1 2 correctly: > > # include <iostream> > struct Pair { > int x, y ; > Pair(int x, int y) : x(x), y(y) {} > } ; This is not the same. In the above, the x outside the parens is ALWAYS a member. D does not have this syntax. Change it to the same as your D implementation, and you get the same result (actually worse, because C++ will not initialize x and y for you). > int main() { > auto P = Pair(1, 2) ; > std::cout << P.x << ' ' << P.y << std::endl ; > } > > It seems to me that D should either not permit argument names to > shadow the member names, since it has no initializer lists and all > members are automatically initialized. Comments? You're missing the "or" part of that statement :) But 2 things: x = x; This should produce an error, or at least a warning I think, as it does nothing. However, even with dmd -w, it does not. I know I have seen the compiler complain about noop statements before, I just don't know under what circumstances and 2, you would use the same mechanism as you use with C++ to initialize the items inside the ctor: this.x = x; Note, the rules for shadowing are the same as for any function parameters to any function vs. members or module variables. Nothing is inconsistent here. -Steve |
Copyright © 1999-2021 by the D Language Foundation