É correto dizer que uma variável é uma instância de um tipo de dados?
9
(que pode alterar seu valor ao longo do programa)
Ou a 'instância de algo' está estritamente relacionada a classes e objetos? Se sim, como você definiria o conceito de 'variável' quando se trata de C ++?
C # e Java diferem do C ++ de duas maneiras interessantes. Primeiro, eles tentam unificar os tipos primitivos com os tipos de objeto (e estrutura) (para que você possa falar sobre uma instância de int), enquanto o C ++ não. Segundo, em C # e Java, variáveis de tipos de objetos são referências implícitas a instâncias (de classes) na pilha e também não falamos de ponteiros para objetos, enquanto em C ++, como a resposta de @ coredump, variáveis locais de tipos de objetos são ligações a instâncias na pilha e distinguimos explicitamente entre objetos e ponteiros para objetos.
Erik Eidt 25/03
Respostas:
8
Tanto quanto sei, é correto chamar valores de tipos primitivos de instâncias desse tipo (consulte, por exemplo, "C ++ Type System" , do manual do Visual Studio, mas ainda estou procurando outra fonte), embora eu acredite que esse termo seja usado principalmente ao discutir objetos. Um objeto é uma instância de uma classe C se ele foi construído a partir de um construtor definido na classe C ou em uma de suas subclasses.
Uma variável em C ++ não é um conceito de tempo de execução. Existe dentro do seu compilador como uma ligação lexical entre o nome da variável e um local abstrato (mutável se não const). Depois que um programa é compilado, as variáveis não estão mais lá. Em vez disso, os dados são lidos e gravados em registros, memória etc.
" Geralmente, não se diz que valores de tipos primitivos sejam instâncias desse tipo; é reservado a objetos e classes. " Isso não é verdade. Em nenhum lugar do padrão os valores de tipos primitivos não são considerados objetos. A definição de variável também não muda de forma alguma, dependendo de ser uma classe definida pelo usuário ou um tipo primitivo.
Nicol Bolas 25/03
@NicolBolas Eu nunca ouvi alguém se referir a números inteiros como instâncias de algo no contexto de C ++, e tenho certeza de que é correto dizer que não são instâncias de nada, mesmo que o padrão não mencione isso explicitamente. Se não, de que são instâncias? Também não vejo onde esta resposta afirma que a definição de uma variável muda entre tipos e objetos primitivos; parece estar afirmando que "instâncias" simplesmente não têm nada a ver com a definição de uma variável.
Ixrec 25/03
2
@Ixrec: " Se não, quais são as instâncias? " O tipo int. O padrão C ++ não faz distinção entre tipos primitivos e não primitivos ao falar sobre o que as declarações de variáveis fazem. Portanto, T t;declara um objeto do tipo T, não importa que tipo Tseja.
Nicol Bolas 25/03
11
@Ixrec: Observe que literais são um tipo diferente de coisa. Os literais são uma espécie de pré-valor. Mas você não pode criar variáveis literais, então essa é uma discussão diferente.
Nicol Bolas 25/03
5
Ou a 'instância de algo' está estritamente relacionada a classes e objetos? Se sim, como você definiria o conceito de 'variável' quando se trata de C ++?
Para colocá-lo da forma mais concisa possível para C ++
Uma variável é um nome (no código) para um local na memória a ser determinado em tempo de execução.
Uma instância é um objeto que reside na memória em tempo de execução.
Só para ficar claro:
Nem todas as áreas da memória contêm objetos. Por exemplo, algumas áreas da memória podem conter valores de 'lixo'.
Nem todos os objetos de armazenamento de memória receberão um nome no código. Os objetos podem residir em áreas não nomeadas da memória, como uma posição em uma matriz ou em algum lugar no Heap referenciado por um ponteiro.
Quando uma área da memória contém lixo, geralmente é porque nenhum objeto foi inicializado nesse local ou porque algum objeto anteriormente existente foi destruído.
PODs são objetos em C ++. Nem todas as regiões da memória são objetos, mas os PODs não são apenas regiões da memória.
Nicol Bolas 25/03
11
Segundo NicolBolas: PODs são objetos. No entanto, você tem razão quando fala sobre um malloc()buffer recém- editado, mas não inicializado: é uma área de memória que ainda não é um objeto. Da mesma forma, um objeto que foi destruído explicitamente: é uma região de memória que não é mais um objeto.
cmaster - restabelece monica 26/03
@NicolBolas comentário justo, eu mudei essa formulação ligeiramente
Ben Cottrell
1
Bem, o que significa "correto"?
Se queremos ser super-rigorosos, precisamos distinguir entre:
O lado da sintaxe : expressões têm tipos (estáticos)
O lado semântico : objetos são instâncias de classes
Então, em seguida, uma variável de ser uma expressão-ia ter um tipo. Seu valor - o objeto a que se refere - seria uma instância de alguma classe. E observe que o tipo da variável e a classe do objeto geralmente não são a mesma coisa - o tipo estático da variável coloca um limite superior nas classes de tempo de execução dos objetos, de modo que as classes devem ser um subtipo da classe que corresponde ao tipo.
Você quer repetir esse bocado grande o tempo todo? Parreira não. Quão estritamente vs. vagamente queremos conversar depende do contexto. Muitas vezes, não há realmente nenhum problema em dizer que "a variável é uma instância desse tipo". O que está acontecendo realmente é que estamos usando a variável e o tipo metonimicamente para nos referirmos ao objeto e a uma superclasse de sua classe de tempo de execução.
Muitas pessoas reservam "instância" para instâncias de classes. Se você fizer isso em C ++, uma variável pode ser uma instância de uma classe, uma referência a uma instância, um ponteiro para uma instância ou um tipo primitivo (você provavelmente contaria estruturas como classes nesse contexto, elas são quase completamente o mesmo). Em Java ou Objective-C, as variáveis nunca seriam instâncias, mas possivelmente referências a instâncias.
Esqueceu: Por um curto período, um ponteiro C ++ pode ser um ponteiro para a memória bruta, por exemplo "this" antes que o construtor comece a executar. Você provavelmente não chamaria * isso de instância ainda neste momento.
Respostas:
Tanto quanto sei, é correto chamar valores de tipos primitivos de instâncias desse tipo (consulte, por exemplo, "C ++ Type System" , do manual do Visual Studio, mas ainda estou procurando outra fonte), embora eu acredite que esse termo seja usado principalmente ao discutir objetos. Um objeto é uma instância de uma classe C se ele foi construído a partir de um construtor definido na classe C ou em uma de suas subclasses.
Uma variável em C ++ não é um conceito de tempo de execução. Existe dentro do seu compilador como uma ligação lexical entre o nome da variável e um local abstrato (mutável se não const). Depois que um programa é compilado, as variáveis não estão mais lá. Em vez disso, os dados são lidos e gravados em registros, memória etc.
fonte
int
. O padrão C ++ não faz distinção entre tipos primitivos e não primitivos ao falar sobre o que as declarações de variáveis fazem. Portanto,T t;
declara um objeto do tipoT
, não importa que tipoT
seja.Para colocá-lo da forma mais concisa possível para C ++
Só para ficar claro:
fonte
malloc()
buffer recém- editado, mas não inicializado: é uma área de memória que ainda não é um objeto. Da mesma forma, um objeto que foi destruído explicitamente: é uma região de memória que não é mais um objeto.Bem, o que significa "correto"?
Se queremos ser super-rigorosos, precisamos distinguir entre:
Então, em seguida, uma variável de ser uma expressão-ia ter um tipo. Seu valor - o objeto a que se refere - seria uma instância de alguma classe. E observe que o tipo da variável e a classe do objeto geralmente não são a mesma coisa - o tipo estático da variável coloca um limite superior nas classes de tempo de execução dos objetos, de modo que as classes devem ser um subtipo da classe que corresponde ao tipo.
Você quer repetir esse bocado grande o tempo todo? Parreira não. Quão estritamente vs. vagamente queremos conversar depende do contexto. Muitas vezes, não há realmente nenhum problema em dizer que "a variável é uma instância desse tipo". O que está acontecendo realmente é que estamos usando a variável e o tipo metonimicamente para nos referirmos ao objeto e a uma superclasse de sua classe de tempo de execução.
fonte
A menos que você queira passar toda a sua vida em purismo e sofisma ... sim.
Toda vez que você mantém algo que é identificado com exclusividade, é usado para forjar outras coisas identificáveis com exclusividade.
Algumas dessas instanciações podem ter nomes mais precisos, mas em geral isso funciona.
fonte
Muitas pessoas reservam "instância" para instâncias de classes. Se você fizer isso em C ++, uma variável pode ser uma instância de uma classe, uma referência a uma instância, um ponteiro para uma instância ou um tipo primitivo (você provavelmente contaria estruturas como classes nesse contexto, elas são quase completamente o mesmo). Em Java ou Objective-C, as variáveis nunca seriam instâncias, mas possivelmente referências a instâncias.
Esqueceu: Por um curto período, um ponteiro C ++ pode ser um ponteiro para a memória bruta, por exemplo "this" antes que o construtor comece a executar. Você provavelmente não chamaria * isso de instância ainda neste momento.
fonte