2009-03-21 12 views

Respuesta

7

Stroustrup siempre fue muy reacio a introducir un nuevo símbolo o nombre reservado, por lo que probablemente lo usó para evitar que la característica se viera rara para los usuarios de C.

+0

Eso tiene sentido. Aunque en mi humilde opinión, todo el concepto de referencias era lo suficientemente extraño para los usuarios de C desde hace mucho tiempo, que tener de repente tener el operador de dirección de tener una semántica diferente puede no haber sido natural ... – Uri

+0

Hmm ... tal vez no deberías mira esto: http://www.open-std.org/JTC1/sc22/wg21/docs/papers/2004/n1690.html –

+0

Acabo de recordar algo de D & EC++ - desea ahora haber insertado una palabra clave 'abstracta' en lugar de usar '= 0' en métodos virtuales; pero la reacción a las nuevas palabras reservadas fue violentamente negativa (aunque, irónicamente, seguramente no habría necesitado ser una palabra reservada) –

12

Además de la respuesta de Earwicker, que generalmente estoy de acuerdo. También especulo que dado que & es el operador de "dirección de", es algo apropiado. Dado que una referencia en muchos sentidos es como pasar por dirección en lugar de por valor.

Además de eso, tomar la dirección de una variable se refiere a menudo como "referencia"

(Sí sé que referencias no tienen a implementarse el uso de punteros bajo el capó, soy refiriéndose a la forma en que funcionan conceptualmente).

Esto es solo una especulación.

2

Quién sabe por qué BS hace nada, pero mi conjetura es que debido a que el aplicación de los parámetros de referencia consiste en pasar la dirección de un valor-I, BS eligió el C operador de dirección, ya que daría a los programadores de C la idea correcta acerca el modelo de costo

2

Aquí está mi teoría sobre eso. Creo que tiene mucho que ver con qué operadores son válidos (sintácticamente) para los símbolos. Considere

int a[1]; // a[1] is valid (syntactically) 
int *a; // *a is valid 
int a(char, bool); // a(<a char>, <a bool>) is valid (function call) 
int C::*a; // <a C>.*a is valid 

Conceptualmente, en esas declaraciones lo que se denomina con un tipo (C, char, bool) está sustituido con una expresión de ese tipo más adelante. Por supuesto, la intención es reutilizar la mayor parte del lenguaje existente como sea posible. Así que creo que usó &:

int &a; // &a is valid 

El único importante es que & es única válida en el tipo de expresión denota una referencia: Para lvalues. Las referencias son lvalues ​​(variables con nombre son demasiado) y sólo para ellos & se pueden aplicar:

int &g(); // &g() is valid (taking the address of the referred to integer) 
int g(); // &g() is *not* valid (can't apply to temporary int) 
+0

Voto, pero tenga en cuenta que "int & a; // & a es válido" no está permitido sin asignación ... – Klaim

+0

sí, soy consciente de eso. Intencionalmente lo dejé sin inicializar porque pensé que no sería más claro insertar una inicialización = some_int; Del mismo modo, cuando hubiera definido una clase C vacía para el caso del puntero del miembro. Quería resaltar su uso en expresiones. gracias por su +1 :) –

+0

lamentablemente, todo esto se rompe con las referencias rvalue en C++ 1x donde se ve como int &&a; :) –

2

Mi pensamiento era que hay 2 símbolos utilizados en los punteros: * y &. ya que int * significa un puntero a un int, probablemente Stroustrup no quería introducir un símbolo completamente nuevo. Como las referencias son como punteros, se mantuvo con &. Además, el único uso previamente válido de & era tomar la dirección de algo, por lo que estaba bien usarlo en declaraciones.

Cuestiones relacionadas