top 70 c interview questions
Perguntas da entrevista C ++ básicas e avançadas mais frequentes com exemplos de código para candidatos de nível de entrada, bem como para profissionais experientes:
Este artigo detalhado certamente será um marcador para aqueles que estão se preparando para uma entrevista em C ++.
Quase todos os principais tópicos em C ++ são cobertos aqui, juntamente com algumas questões básicas sobre tópicos avançados, como Biblioteca de Modelos Padrão (STL), etc.
Este conjunto de perguntas de codificação C ++ o ajudará a enfrentar qualquer entrevista C ++ com confiança e esclarecê-la com sucesso na primeira tentativa.
O que você aprenderá:
- Perguntas da entrevista C ++ com exemplos de código
Perguntas da entrevista C ++ com exemplos de código
Listadas abaixo estão as perguntas mais populares da entrevista de programação em C ++ respondidas por um especialista em C ++.
Leia também => Principais perguntas da entrevista sobre programação C
C ++ básico
Estrutura do programa C ++
P # 1) Qual é a estrutura básica de um programa C ++?
Responda: A estrutura básica de um programa C ++ é mostrada abaixo:
#include int main() { cout<<”Hello,World!”; return 0; }
A primeira linha que começa com “ # ' é um Directiva do pré-processador . Neste caso, estamos usando incluir como uma diretiva que diz ao compilador para incluir um cabeçalho enquanto “ iostream.h ”Que será usado para entrada / saída básica posteriormente no programa.
A próxima linha é a função “principal” que retorna um inteiro. A função principal é o ponto de partida de execução para qualquer programa C ++. Independentemente de sua posição no arquivo de código-fonte, o conteúdo da função principal é sempre executado primeiro pelo compilador C ++.
Na próxima linha, podemos ver as chaves abertas que indicam o início de um bloco de código. Depois disso, vemos a instrução de programação ou a linha de código que usa a contagem que é o fluxo de saída padrão (sua definição está presente em iostream.h).
Este fluxo de saída pega uma string de caracteres e a imprime em um dispositivo de saída padrão. Nesse caso, é “Olá, Mundo!”. Observe que cada instrução C ++ termina com um ponto-e-vírgula (;), que é muito necessário e sua omissão resultará em erros de compilação.
Antes de fechar as chaves}, vemos outra linha “return 0;”. Este é o ponto de retorno para a função principal.
Todo programa C ++ terá uma estrutura básica como mostrado acima com uma diretiva de pré-processador, declaração da função principal seguida por um bloco de código e então um ponto de retorno para a função principal que indica a execução bem-sucedida do programa.
P # 2) Quais são os comentários em C ++?
Responda: Os comentários em C ++ são simplesmente uma parte do código-fonte ignorada pelo compilador. Eles são úteis apenas para um programador adicionar uma descrição ou informações adicionais sobre seu código-fonte.
Em C ++, existem duas maneiras de adicionar comentários:
- // comentário de linha única
- / * bloquear comentário * /
O primeiro tipo descartará tudo depois que o compilador encontrar “//”. No segundo tipo, o compilador descarta tudo entre “/ *” e “* /”.
Variáveis, tipos de dados e constantes
Q # 3) Diferença entre declaração e definição de uma variável.
Responda: A declaração de uma variável é apenas especificar o tipo de dados de uma variável e o nome da variável. Como resultado da declaração, pedimos ao compilador para reservar o espaço para uma variável na memória de acordo com o tipo de dados especificado.
Exemplo:
int Result; char c; int a,b,c;
Todos os itens acima são declarações válidas. Além disso, observe que, como resultado da declaração, o valor da variável é indeterminado.
Considerando que, uma definição é uma implementação / instanciação da variável declarada, onde vinculamos o valor apropriado à variável declarada para que o vinculador seja capaz de vincular referências às entidades apropriadas.
Exemplo acima ,
Resultado = 10;
C = ‘A’;
Estas são definições válidas.
Q # 4) Comentário sobre o escopo local e global de uma variável.
Responda: O escopo de uma variável é definido como a extensão do código do programa dentro do qual a variável permanece ativa, ou seja, ela pode ser declarada, definida ou trabalhada.
Existem dois tipos de escopo em C ++:
- Escopo local: Diz-se que uma variável tem um escopo local ou é local quando é declarada dentro de um bloco de código. A variável permanece ativa apenas dentro do bloco e não é acessível fora do bloco de código.
- Âmbito global: Uma variável tem um escopo global quando está acessível em todo o programa. Uma variável global é declarada no topo do programa antes de todas as definições de função.
Exemplo:
#include Int globalResult=0; //global variable int main() { Int localVar = 10; //local variable. ….. }
Q # 5) Qual é a precedência quando há uma variável global e uma variável local no programa com o mesmo nome?
Responda: Sempre que houver uma variável local com o mesmo nome de uma variável global, o compilador dá precedência à variável local.
Exemplo:
#include int globalVar = 2; int main() { int globalVar = 5; cout<A saída do código acima é 5. Isso porque, embora ambas as variáveis tenham o mesmo nome, o compilador deu preferência ao escopo local.
Q # 6) Quando houver uma variável global e uma variável local com o mesmo nome, como você acessará a variável global?
Responda: Quando houver duas variáveis com o mesmo nome, mas escopo diferente, ou seja, uma é uma variável local e a outra é uma variável global, o compilador dará preferência a uma variável local.
Para acessar a variável global, usamos um “ operador de resolução de escopo (: :) ”. Usando este operador, podemos acessar o valor da variável global.
Exemplo:
#include int x= 10; int main() { int x= 2; cout<<”Global Variable x = “<<::x; cout<<”
local Variable x= “< Resultado:
Variável Global x = 10
Variável local x = 2
P # 7) Quantas maneiras existem para inicializar um int com uma constante?
Responda: Existem duas maneiras:
- O primeiro formato usa a notação C tradicional.
resultado int = 10; - O segundo formato usa a notação do construtor.
resultado int (10);
Constantes
Q # 8) O que é uma constante? Explique com um exemplo.
Responda: Uma constante é uma expressão que possui um valor fixo. Eles podem ser divididos em inteiros, decimais, ponto flutuante, caractere ou constantes de string, dependendo do tipo de dados.
Além do decimal, C ++ também suporta mais duas constantes, ou seja, constantes octais (para a base 8) e hexadecimais (para a base 16).
Exemplos de constantes:
- 75 // inteiro (decimal)
- 0113 // octal
- 0x4b // hexadecimal
- 3.142 // ponto flutuante
- ‘C’ // caractere constante
- “Hello, World” // constante de string
Observação: Quando temos que representar um único caractere, usamos aspas simples e quando queremos definir uma constante com mais de um caractere, usamos aspas duplas.
P # 9) Como você define / declara constantes em C ++?
Responda: Em C ++, podemos definir nossas próprias constantes usando o #definir Directiva do pré-processador.
# define o valor do identificador
Exemplo:
#include #define PI 3.142 int main () { float radius =5, area; area = PI * r * r; cout<<”Area of a Circle = “< Resultado: Área de um Círculo = 78,55
Conforme mostrado no exemplo acima, uma vez que definimos uma constante usando a diretiva #define, podemos usá-la em todo o programa e substituir seu valor.
Podemos declarar constantes em C ++ usando o método “ const ”Palavra-chave. Dessa forma, é semelhante à declaração de uma variável, mas com um prefixo const.
Exemplos de declaração de uma constante
const int pi = 3,142;
const char c = “sth”;
const zipcode = 411014;
Nos exemplos acima, sempre que o tipo de uma constante não é especificado, o compilador C ++ padroniza para um tipo inteiro.
Operadores
Q # 10) Comentário sobre o operador de atribuição em C ++.
Responda: O operador de atribuição em C ++ é usado para atribuir um valor a outra variável.
a = 5;
Esta linha de código atribui o valor inteiro 5 para variável para .
A parte à esquerda do operador = é conhecida como um lvalue (valor à esquerda) e à direita como rvalue (valor correto). eu valor deve ser sempre uma variável enquanto o lado direito pode ser uma constante, uma variável, o resultado de uma operação ou qualquer combinação deles.
A operação de atribuição ocorre sempre da direita para a esquerda e nunca no inverso.
Uma propriedade que C ++ tem sobre as outras linguagens de programação é que o operador de atribuição pode ser usado como o rvalue (ou parte de um rvalue ) para outra atribuição.
Exemplo:
a = 2 + (b = 5);
é equivalente a:
b = 5;
a = 2 + b;
O que significa, primeiro atribua 5 para variável b e então atribuir a para, O valor que dois mais o resultado da expressão anterior de b (isto é 5), sai para com um valor final de 7 .
Assim, a seguinte expressão também é válida em C ++:
a = b = c = 5;
atribua 5 a variáveis para , b e c .
Q # 11) Qual é a diferença entre igual a (==) e Operador de Atribuição (=)?
Responda: Em C ++, igual a (==) e operador de atribuição (=) são dois operadores completamente diferentes.
Igual a (==) é um operador relacional de igualdade que avalia duas expressões para ver se são iguais e retorna verdadeiro se forem iguais e falso se não forem.
O operador de atribuição (=) é usado para atribuir um valor a uma variável. Portanto, podemos ter uma operação de atribuição complexa dentro do operador relacional de igualdade para avaliação.
Q # 12) Quais são os vários operadores aritméticos em C ++?
Resposta: C ++ suporta os seguintes operadores aritméticos:
- + adição
- - subtração
- * multiplicação
- / divisão
- % módulo
Vamos demonstrar os vários operadores aritméticos com o seguinte trecho de código.
Exemplo:
#include int main () { int a=5, b=3; cout<<”a + b = “< Resultado :
a + b = 8
a - b = 2
a * b = 15
a / b = 2
a% b = 1
Como mostrado acima, todas as outras operações são diretas e iguais às operações aritméticas reais, exceto o operador módulo que é bastante diferente. O operador Módulo divide aeb e o resultado da operação é o resto da divisão.
Q # 13) Quais são os vários operadores de atribuição de compostos em C ++?
Responda: A seguir estão os operadores de atribuição de compostos em C ++:
+ =, - =, * =, / =,% =, >> =,<<=, &=, ^=,|=
O operador de atribuição composto é um dos recursos mais importantes da linguagem C ++, que nos permite alterar o valor de uma variável com um dos operadores básicos:
Exemplo:
value += increase; is equivalent to value = value + increase; if base_salary is a variable of type int. int base_salary = 1000; base_salary += 1000; #base_salary = base_salary + 1000 base_salary *= 5; #base_salary = base_salary * 5;
Q # 14) Declare a diferença entre as operações de pré e pós incremento / decremento.
Responda: C ++ permite dois operadores, ou seja, ++ (incremento) e - (decremento), que permitem adicionar 1 ao valor existente de uma variável e subtrair 1 da variável, respectivamente. Esses operadores, por sua vez, são chamados de incremento (++) e decremento (-).
Exemplo:
a = 5;
a ++;
A segunda instrução, a ++, fará com que 1 seja adicionado ao valor de a. Assim, a ++ é equivalente a
a = a + 1; ou
a + = 1;
Uma característica única desses operadores é que podemos prefixar ou sufocar esses operadores com a variável. Portanto, se a é uma variável e prefixamos o operador de incremento, ele será
++ a;
Isso é chamado de Pré-incremento. Da mesma forma, temos pré-decremento também.
Se prefixarmos a variável a com um operador de incremento, teremos,
a ++;
Este é o pós-incremento. Da mesma forma, temos pós-decremento também.
A diferença entre o significado de pré e pós depende de como a expressão é avaliada e o resultado é armazenado.
No caso do operador de pré-incremento / decremento, a operação de incremento / decremento é realizada primeiro e, em seguida, o resultado passado para um lvalue. Enquanto para operações pós-incremento / decremento, o lvalue é avaliado primeiro e então o incremento / decremento é executado de acordo.
Exemplo:
a = 5; b = 6;
++ a; # a = 6
b–; # b = 6
-uma; # a = 5
b ++; # 6
I / O através do console
P # 15) Quais são os operadores de Extração e Inserção em C ++? Explique com exemplos.
Responda: Na biblioteca iostream.h de C ++, China , e custo são os dois fluxos de dados usados para entrada e saída, respectivamente. Cout é normalmente direcionado para a tela e cin é atribuído ao teclado.
“Cin” (operador de extração): Usando operador sobrecarregado >> com fluxo cin, C ++ lida com a entrada padrão.
int age; cin>>age;
Conforme mostrado no exemplo acima, uma variável inteira 'idade' é declarada e, em seguida, aguarda cin (teclado) para inserir os dados. “Cin” processa a entrada apenas quando a tecla RETURN é pressionada.
“Cout” (operador de inserção): Isso é usado em conjunto com o sobrecarregado<< operator. It directs the data that followed it into the cout stream.
Exemplo:
melhor programa para monitorar a temperatura do computador
cout<<”Hello, World!”; cout<<123;
Estruturas e funções de controle
Estruturas de controle e loops
Q # 16) Qual é a diferença entre o loop while e do while? Explique com exemplos.
Responda: O formato do loop while em C ++ é:
While (expressão)
{declarações;}
O bloco de instruções em while é executado, desde que a condição na expressão fornecida seja verdadeira.
Exemplo:
#include int main() { int n; cout<>n; while(n>0) { cout<<” “<No código acima, o loop sairá diretamente se n for 0. Assim, no loop while, a condição de término está no início do loop e se for cumprida, nenhuma iteração do loop será executada.
Em seguida, consideramos o loop do-while.
O formato geral do do-while é:
fazer {declaração;} enquanto (condição);
Exemplo:
#include int main() { int n; cout<>n; do { cout<No código acima, podemos ver que a instrução dentro do loop é executada pelo menos uma vez, pois a condição do loop está no final. Estas são as principais diferenças entre o while e do-while.
No caso do loop while, podemos sair diretamente do loop no início, se a condição não for atendida, enquanto no loop do-while executamos as instruções do loop pelo menos uma vez.
Funções
Q # 17) O que você quer dizer com tipo de retorno 'nulo'?
Responda: Todas as funções devem retornar um valor de acordo com a sintaxe geral.
No entanto, no caso, se não quisermos que uma função retorne qualquer valor, usamos “ vazio ”Para indicar isso. Isso significa que usamos “ vazio ”Para indicar que a função não tem valor de retorno ou retorna“ vazio ”.
Exemplo:
como abrir uma jarra com java
void myfunc() { Cout<<”Hello,This is my function!!”; } int main() { myfunc(); return 0; }
Q # 18) Explique a passagem por valor e a passagem por referência.
Responda: Ao passar parâmetros para a função usando “Passar por Valor”, passamos uma cópia dos parâmetros para a função.
Conseqüentemente, quaisquer modificações feitas nos parâmetros na função chamada não são passadas de volta para a função de chamada. Assim, as variáveis na função de chamada permanecem inalteradas.
Exemplo:
void printFunc(int a,int b,int c) { a *=2; b *=2; c *=2; } int main() { int x = 1,y=3,z=4; printFunc(x,y,z); cout<<”x = “< Resultado:
x = 1
y = 3
z = 4
Como visto acima, embora os parâmetros tenham sido alterados na função chamada, seus valores não foram refletidos na função de chamada, pois foram passados por valor.
No entanto, se quisermos obter os valores alterados da função de volta para a função de chamada, usamos a técnica “Passar por Referência”.
Para demonstrar isso, modificamos o programa acima da seguinte maneira:
void printFunc(int& a,int& b,int& c) { a *=2; b *=2; c *=2; } int main() { int x = 1,y=3,z=4; printFunc(x,y,z); cout<<”x = “< Resultado:
x = 2
y = 6
z = 8
Conforme mostrado acima, as modificações feitas nos parâmetros nas funções chamadas são passadas para a função de chamada quando usamos a técnica “Passar por referência”. Isso ocorre porque, usando essa técnica, não passamos uma cópia dos parâmetros, mas, na verdade, passamos a própria referência da variável.
Q # 19) Quais são os parâmetros padrão? Como eles são avaliados na função C ++?
Responda: Parâmetro padrão é um valor atribuído a cada parâmetro ao declarar uma função.
Este valor é usado se o parâmetro for deixado em branco durante a chamada da função. Para especificar um valor padrão para um determinado parâmetro, simplesmente atribuímos um valor ao parâmetro na declaração da função.
Se o valor não for passado para este parâmetro durante a chamada da função, o compilador usará o valor padrão fornecido. Se um valor for especificado, esse valor padrão será pisado e o valor passado será usado.
Exemplo:
int multiply(int a, int b=2) { int r; r = a * b; return r; } int main() { Cout< Resultado:
12
6
Conforme mostrado no código acima, existem duas chamadas para multiplicar a função. Na primeira chamada, apenas um parâmetro é passado com um valor. Nesse caso, o segundo parâmetro é o valor padrão fornecido. Mas na segunda chamada, quando ambos os valores dos parâmetros são passados, o valor padrão é sobrescrito e o valor passado é usado.
Q # 20) O que é uma função embutida em C ++?
Responda: Função embutida é uma função que é compilada pelo compilador como o ponto de chamar a função e o código é substituído nesse ponto. Isso torna a compilação mais rápida. Esta função é definida prefixando o protótipo da função com a palavra-chave “inline”.
Essas funções são vantajosas apenas quando o código da função embutida é pequeno e simples. Embora uma função seja definida como embutida, é completamente dependente do compilador para avaliá-la como embutida ou não.
Estrutura de dados avançada
Arrays
Q # 21) Por que as matrizes são geralmente processadas com o loop for?
Responda: Array usa o índice para percorrer cada um de seus elementos.
Se A for uma matriz, cada um de seus elementos será acessado como A (i). Programaticamente, tudo o que é necessário para que isso funcione é um bloco iterativo com uma variável de loop i que serve como um índice (contador) incrementando de 0 a A.length-1.
Isso é exatamente o que um loop faz e esta é a razão pela qual processamos arrays usando loops for.
Q # 22) Declare a diferença entre delete e delete ().
Responda: “Delete ()” é usado para liberar a memória alocada para um array que foi alocado usando new (). “Delete” é usado para liberar um pedaço de memória que foi alocado usando new.
P # 23) O que há de errado com este código?
T * p = novo T (10);
delete p;
Responda: O código acima está sintaticamente correto e irá compilar bem.
O único problema é que ele apenas excluirá o primeiro elemento da matriz. Embora todo o array seja excluído, apenas o destruidor do primeiro elemento será chamado e a memória do primeiro elemento será liberada.
Q # 24) Qual é a ordem em que os objetos em uma matriz são destruídos?
Responda: Os objetos em uma matriz são destruídos na ordem inversa da construção: Construídos primeiro, destruídos pela última vez.
No seguinte exemplo, a ordem para destruidores será a (9), a (8), ..., a (1), a (0):
voiduserCode() { Car a(10); ... }
Ponteiros
P # 25) O que há de errado com este código?
T * p = 0;
delete p;
Responda: No código acima, o ponteiro é um ponteiro nulo. De acordo com o padrão C ++ 03, é perfeitamente válido chamar delete em um ponteiro NULL. O operador delete cuidaria da verificação NULL internamente.
P # 26) O que é uma variável de referência em C ++?
Responda: Uma variável de referência é um nome alternativo para a variável existente. Isso significa que tanto o nome da variável quanto a variável de referência apontam para o mesmo local de memória. Assim, sempre que a variável é atualizada, a referência também é atualizada.
Exemplo:
int a=10; int& b = a;
Aqui, b é a referência de a.
Classes de Armazenamento
Q # 27) O que é uma classe de armazenamento? Mencione as classes de armazenamento em C ++.
Responda: A classe de armazenamento determina a vida ou o escopo dos símbolos, como variáveis ou funções.
C ++ suporta as seguintes classes de armazenamento:
- Auto
- Estático
- Externo
- Registro
- Mutável
Q # 28) Explique o especificador de classe de armazenamento mutável.
Responda: A variável de um membro de um objeto de classe constante não pode ser alterada. No entanto, ao declarar as variáveis como “mutáveis”, podemos alterar os valores dessas variáveis.
P # 29) Para que serve a palavra-chave auto?
Responda: Por padrão, cada variável local da função é automática, ou seja, auto . Na função abaixo, ambas as variáveis ‘i’ e ‘j’ são variáveis automáticas.
void f() { int i; auto int j; }
NOTA : Uma variável global não é uma variável automática.
Q # 30) O que é uma variável estática?
Responda: Uma variável estática é uma variável local que retém seu valor nas chamadas de função. Variáveis estáticas são declaradas usando a palavra-chave “estática”. Variáveis numéricas que são estáticas têm o valor padrão zero.
A função a seguir imprimirá 1 2 3 se chamada três vezes.
void f() { static int i; ++i; printf(“%d “,i); }
Se uma variável global for estática, sua visibilidade será limitada ao mesmo código-fonte.
P # 31) Qual é o propósito do Extern Storage Specifier?
Responda: O especificador “Extern” é usado para resolver o escopo de um símbolo global.
#include using nam espace std; main() { extern int i; cout< No código acima, “i” pode ser visível fora do arquivo onde está definido.
Q # 32) Explique o Especificador de Armazenamento de Registros.
Responda: A variável de “registro” deve ser usada sempre que a variável for usada. Quando uma variável é declarada com um especificador de “registro”, o compilador fornece o registro da CPU para seu armazenamento, a fim de acelerar a pesquisa da variável.
Q # 33) Quando usar argumentos de referência “const” em uma função?
Responda: Usar argumentos de referência “const” em uma função é benéfico de várias maneiras:
- “Const” protege contra erros de programação que podem alterar os dados.
- Como resultado do uso de “const”, a função é capaz de processar argumentos reais const e não const, o que não é possível quando “const” não é usado.
- Usar uma referência const permitirá que a função gere e use uma variável temporária de maneira apropriada.
Estrutura e tipos de dados definidos pelo usuário
Q # 34) O que é uma classe?
Responda: Classe é um tipo de dados definido pelo usuário em C ++. Ele pode ser criado para resolver um determinado tipo de problema. Após a criação, o usuário não é obrigado a conhecer os detalhes do funcionamento de uma classe.
Em geral, a classe atua como um blueprint de um projeto e pode incluir vários parâmetros e funções ou ações que operam nesses parâmetros. Eles são chamados de membros da classe.
Q # 35) Diferença entre classe e estrutura.
Responda:
Estrutura: Na linguagem C, a estrutura é usada para agrupar diferentes tipos de tipos de dados. As variáveis dentro de uma estrutura são chamadas de membros da estrutura. Esses membros são, por padrão, públicos e podem ser acessados usando o nome da estrutura seguido por um operador ponto e, em seguida, o nome do membro.
Aula: A classe é uma sucessora da Estrutura. C ++ estende a definição da estrutura para incluir as funções que operam em seus membros. Por padrão, todos os membros da classe são privados.
Programação orientada a objetos com C ++
Classes, construtores, destruidores
Q # 36) O que é namespace?
Responda: O namespace nos permite agrupar um conjunto de classes globais, objetos e / ou funções sob um nome específico.
A forma geral de usar namespaces é:
identificador de namespace {namespace-body}
Onde identifier é qualquer identificador válido e o namespace-body é o conjunto de classes, objetos e funções que estão incluídos no namespace. Os namespaces são especialmente úteis no caso em que existe a possibilidade de mais de um objeto ter o mesmo nome, resultando em conflitos de nomes.
P # 37) Qual é o uso da declaração 'usando'?
Responda: Usando a declaração é usado para referir um nome do namespace sem o operador de resolução de escopo.
Q # 38) O que é Nome Mangling?
Responda: O compilador C ++ codifica os tipos de parâmetro com função / método em um nome exclusivo. Esse processo é chamado de mutilação de nomes. O processo inverso é denominado demangling.
Exemplo:
A :: b (int, long) const é mutilado como ‘B__C3Ail’ .
Para um construtor, o nome do método é omitido.
Aquilo é A :: A (int, long) const é mutilado como 'C3Ail'.
Q # 39) Qual é a diferença entre um objeto e uma classe?
Responda: Classe é a planta de um projeto ou problema a ser resolvido e consiste em variáveis e métodos. Eles são chamados de membros da classe. Não podemos acessar métodos ou variáveis da classe por conta própria, a menos que sejam declarados estáticos.
Para acessar os membros da classe e colocá-los em uso, devemos criar uma instância de uma classe que é chamada de Object. A classe tem uma vida útil ilimitada, enquanto um objeto tem apenas uma vida útil limitada.
P # 40) Quais são os vários Access Specifiers em C ++?
Responda: C ++ suporta os seguintes especificadores de acesso:
- Público: Membros de dados e funções são acessíveis fora da classe.
- Privado: Membros de dados e funções não são acessíveis fora da classe. A exceção é o uso de uma classe de amigo.
- Protegido: Membros de dados e funções são acessíveis apenas às classes derivadas.
Exemplo:
Descreva PRIVADO, PROTEGIDO e PÚBLICO juntamente com suas diferenças e dê exemplos.
class A{ int x; int y; public int a; protected bool flag; public A() : x(0) , y(0) {} //default (no argument) constructor }; main(){ A MyObj; MyObj.x = 5; // Compiler will issue a ERROR as x is private int x = MyObj.x; // Compiler will issue a compile ERROR MyObj.x is private MyObj.a = 10; // no problem; a is public member int col = MyObj.a; // no problem MyObj.flag = true; // Compiler will issue a ERROR; protected values are read only bool isFlag = MyObj.flag; // no problem
P # 41) O que é um construtor e como ele é chamado?
Responda: Construtor é uma função membro da classe com o mesmo nome da classe. É usado principalmente para inicializar os membros da classe. Por padrão, os construtores são públicos.
Existem duas maneiras pelas quais os construtores são chamados:
- Implicitamente: Os construtores são implicitamente chamados pelo compilador quando um objeto da classe é criado. Isso cria um objeto em uma pilha.
- Chamada explícita: Quando o objeto de uma classe é criado usando new, os construtores são chamados explicitamente. Isso geralmente cria um objeto em um Heap.
Exemplo:
class A{ int x; int y; public A() : x(0) , y(0) {} //default (no argument) constructor }; main() { A Myobj; // Implicit Constructor call. In order to allocate memory on stack, //the default constructor is implicitly called. A * pPoint = new A(); // Explicit Constructor call. In order to allocate //memory on HEAP we call the default constructor. }
P # 42) O que é um CONSTRUTOR DE CÓPIAS e quando é chamado?
Responda: Um construtor de cópia é um construtor que aceita um objeto da mesma classe como seu parâmetro e copia seus membros de dados para o objeto na parte esquerda da atribuição. É útil quando precisamos construir um novo objeto da mesma classe.
Exemplo:
class A{ int x; int y; public int color; public A() : x(0) , y(0) {} //default (no argument) constructor public A( const A& ) ; }; A::A( const A & p ) { this->x = p.x; this->y = p.y; this->color = p.color; } main() { A Myobj; Myobj.color = 345; A Anotherobj = A( Myobj ); // now Anotherobj has color = 345 }
Q # 43) O que é um construtor padrão?
Responda: O construtor padrão é um construtor que não tem argumentos ou, se houver, todos eles são argumentos padrão.
Exemplo:
class B { public: B (int m = 0) : n (m) {} int n; }; int main(int argc, char *argv()) { B b; return 0; }
Q # 44) O que é um construtor de conversão?
Responda: É um construtor que aceita um argumento de um tipo diferente. Os construtores de conversão são usados principalmente para converter de um tipo para outro.
Q # 45) O que é um construtor explícito?
Responda: Um construtor de conversão é declarado com a palavra-chave explícita. O compilador não usa um construtor explícito para implementar uma conversão implícita de tipos. Sua finalidade é reservada explicitamente para construção.
Q # 46) Qual é a função da palavra-chave Static para uma variável de membro de classe?
Responda: A variável de membro estático compartilha uma memória comum entre todos os objetos criados para a respectiva classe. Não precisamos nos referir à variável de membro estático usando um objeto. No entanto, ele pode ser acessado usando o próprio nome da classe.
Q # 47) Explique a função de membro estático.
Responda: Uma função de membro estático pode acessar apenas a variável de membro estático da classe. Da mesma forma que as variáveis de membro estático, uma função de membro estático também pode ser acessada usando o nome da classe.
Q # 48) Qual é a ordem em que os objetos locais são destruídos?
Resposta: Considere seguir um trecho de código:
Class A{ …. }; int main() { A a; A b; ... }
Na função principal, temos dois objetos criados um após o outro. Eles são criados em ordem, primeiro a, depois b. Mas quando esses objetos são excluídos ou saem do escopo, o destruidor de cada um será chamado na ordem reversa em que foram construídos.
Portanto, o destruidor de b será chamado primeiro, seguido por a. Mesmo se tivermos uma série de objetos, eles serão destruídos da mesma maneira na ordem inversa de sua criação.
Sobrecarregando
Q # 49) Explique sobrecarga de função e sobrecarga do operador.
Responda: C ++ suporta o conceito de OOPs Polimorfismo que significa “muitas formas”.
Em C ++, temos dois tipos de polimorfismo, ou seja, polimorfismo em tempo de compilação e polimorfismo em tempo de execução. O polimorfismo de tempo de compilação é obtido usando uma técnica de sobrecarga. Sobrecarregar significa simplesmente dar significado adicional a uma entidade, mantendo seu significado básico intacto.
C ++ suporta dois tipos de sobrecarga:
Sobrecarga de função:
A sobrecarga de funções é uma técnica que permite ao programador ter mais de uma função com o mesmo nome, mas com listas de parâmetros diferentes. Em outras palavras, sobrecarregamos a função com diferentes argumentos, ou seja, seja o tipo de argumento, o número de argumentos ou a ordem dos argumentos.
A sobrecarga de função nunca é alcançada em seu tipo de retorno.
Sobrecarga do operador:
Este é outro tipo de polimorfismo de tempo de compilação que é suportado pelo C ++. Na sobrecarga do operador, um operador fica sobrecarregado, de modo que pode operar nos tipos definidos pelo usuário, bem como nos operandos do tipo de dados padrão. Mas, ao fazer isso, a definição padrão desse operador é mantida intacta.
Por exemplo, um operador de adição (+) que opera em tipos de dados numéricos pode ser sobrecarregado para operar em dois objetos exatamente como um objeto de classe de número complexo.
Q # 50) Qual é a diferença entre Sobrecarga de Método e Substituição de Método em C ++?
Responda: A sobrecarga de método é ter funções com o mesmo nome, mas listas de argumentos diferentes. Esta é uma forma de polimorfismo em tempo de compilação.
A substituição de métodos entra em cena quando reescrevemos o método que é derivado de uma classe base. A substituição de método é usada ao lidar com polimorfismo de tempo de execução ou funções virtuais.
Q # 51) Qual é a diferença entre um Construtor de Cópia e um Sobrecarregado Operador de atribuição?
Responda: Um construtor de cópia e um operador de atribuição sobrecarregado basicamente têm o mesmo propósito, ou seja, atribuir o conteúdo de um objeto a outro. Mesmo assim, há uma diferença entre os dois.
Exemplo:
complex c1,c2; c1=c2; //this is assignment complex c3=c2; //copy constructor
No exemplo acima, a segunda instrução c1 = c2 é uma instrução de atribuição sobrecarregada.
Aqui, tanto c1 quanto c2 são objetos já existentes e o conteúdo de c2 é atribuído ao objeto c1. Conseqüentemente, para instrução de atribuição sobrecarregada, os dois objetos já precisam ser criados.
Próxima instrução, c3 = c2 complexo é um exemplo do construtor de cópia. Aqui, o conteúdo de c2 é atribuído a um novo objeto c3, o que significa que o construtor de cópia cria um novo objeto sempre que é executado.
Q # 52) Nomeie os operadores que não podem ser sobrecarregados.
Responda:
- sizeof - operador sizeof
- . - Operador ponto
- . * - operador de desreferenciação
- -> - operador de desreferenciamento de membro
- :: - operador de resolução de escopo
- ?: - operador condicional
Q # 53) A função pode ser sobrecarregada com base no parâmetro que é um valor ou uma referência. Explique se a afirmação é verdadeira.
Responda: Falso. Ambos, Passando por valor e Passando por referência parecem idênticos ao chamador.
Q # 54) Quais são os benefícios da sobrecarga do operador?
Responda: Ao sobrecarregar os operadores padrão em uma classe, podemos estender o significado desses operadores, de forma que eles também possam operar em outros objetos definidos pelo usuário.
A sobrecarga de funções nos permite reduzir a complexidade do código e torná-lo mais claro e legível, pois podemos ter os mesmos nomes de função com listas de argumentos diferentes.
Herança
P # 55) O que é herança?
Responda: Herança é um processo pelo qual podemos adquirir as características de uma entidade existente e formar uma nova entidade adicionando mais recursos a ela.
Em termos de C ++, herança é criar uma nova classe derivando-a de uma classe existente, de forma que essa nova classe tenha as propriedades de sua classe pai, além das suas próprias.
P # 56) Quais são as vantagens da herança?
Responda: A herança permite a reutilização do código, economizando tempo no desenvolvimento do código.
Ao herdar, usamos um software de alta qualidade sem bugs que reduz problemas futuros.
P # 57) O C ++ oferece suporte a vários níveis e herança múltipla?
Responda: sim.
Q # 58) O que são múltiplas heranças (herança virtual)? Quais são as vantagens e desvantagens?
Responda: Em várias heranças, temos mais de uma classe base da qual uma classe derivada pode herdar. Portanto, uma classe derivada usa os recursos e propriedades de mais de uma classe base.
Por exemplo , uma aula motorista terá duas classes básicas, a saber, empregado e uma pessoa porque o motorista é um funcionário tanto quanto uma pessoa. Isso é vantajoso porque a classe driver pode herdar as propriedades do funcionário, bem como a classe pessoal.
Mas, no caso de um funcionário e uma pessoa, a classe terá algumas propriedades em comum. No entanto, uma situação ambígua surgirá, pois a classe do driver não conhecerá as classes das quais as propriedades comuns devem ser herdadas. Esta é a principal desvantagem das heranças múltiplas.
P # 59) Explique os relacionamentos das classes ISA e HASA. Como você implementaria cada?
Responda: O relacionamento “ISA” geralmente exibe herança, pois implica que uma classe “ISA” é uma versão especializada de outra classe. Por exemplo , Um funcionário da ISA. Isso significa que uma classe Employee é herdada da classe Person.
Ao contrário de “ISA”, o relacionamento “HASA” descreve que uma entidade pode ter outra entidade como seu membro ou uma classe tem outro objeto embutido nela.
Portanto, tomando o mesmo exemplo de uma classe Employee, a maneira como associamos a classe Salary ao funcionário não é herdando-a, mas incluindo ou contendo o objeto Salary dentro da classe Employee. A relação “HASA” é melhor exibida por contenção ou agregação.
P # 60) Uma classe derivada herda ou não herda?
Responda: Quando uma classe derivada é construída a partir de uma classe base específica, ela basicamente herda todos os recursos e membros comuns da classe base. Mas existem algumas exceções a esta regra. Por exemplo, uma classe derivada não herda os construtores e destruidores da classe base.
Cada classe tem seus próprios construtores e destruidores. A classe derivada também não herda o operador de atribuição da classe base e amigos da classe. O motivo é que essas entidades são específicas para uma classe particular e se outra classe for derivada ou se for amiga dessa classe, então elas não podem ser passadas para elas.
Polimorfismo
Q # 61) O que é polimorfismo?
Responda: A ideia básica por trás do polimorfismo está em muitas formas. Em C ++, temos dois tipos de polimorfismo:
(i) Polimorfismo em tempo de compilação
No polimorfismo em tempo de compilação, alcançamos muitas formas por sobrecarga. Conseqüentemente, temos uma sobrecarga de operador e sobrecarga de função. (Já cobrimos isso acima)
(ii) Polimorfismo de tempo de execução
Este é o polimorfismo para classes e objetos. A ideia geral é que uma classe base pode ser herdada por várias classes. Um ponteiro de classe base pode apontar para sua classe filha e uma matriz de classe base pode armazenar diferentes objetos de classe filha.
Isso significa que um objeto reage de maneira diferente à mesma chamada de função. Este tipo de polimorfismo pode usar um mecanismo de função virtual.
Q # 62) O que são funções virtuais?
Responda: Uma função virtual permite que as classes derivadas substituam a implementação fornecida pela classe base.
Sempre que temos funções com o mesmo nome na classe base, bem como na classe derivada, surge uma ambigüidade quando tentamos acessar o objeto da classe filha usando um ponteiro de classe base. Como estamos usando um ponteiro de classe base, a função chamada é a função de classe base com o mesmo nome.
Para corrigir essa ambigüidade, usamos a palavra-chave “virtual” antes do protótipo da função na classe base. Em outras palavras, tornamos esta função polimórfica Virtual. Usando uma função Virtual, podemos remover a ambigüidade e podemos acessar todas as funções da classe filha corretamente usando um ponteiro de classe base.
Q # 63) Dê um exemplo de Polimorfismo de tempo de execução / Funções virtuais.
Responda:
class SHAPE{ public virtual Draw() = 0; //abstract class with a pure virtual method }; class CIRCLE: public SHAPE{ public int r; public Draw() { this->drawCircle(0,0,r); } }; class SQUARE: public SHAPE{ public int a; public Draw() { this->drawSquare(0,0,a,a); } }; int main() { SHAPE shape1*; SHAPE shape2*; CIRCLE c1; SQUARE s1; shape1 = &c1; shape2 = &s1; coutNo código acima, a classe SHAPE tem uma função virtual pura e é uma classe abstrata (não pode ser instanciada). Cada classe é derivada de SHAPE que implementa a função Draw () em sua própria maneira.
Além disso, cada função Draw é virtual, de forma que quando usamos um ponteiro de classe base (SHAPE) a cada vez com o objeto das classes derivadas (Circle e SQUARE), as funções Draw apropriadas são chamadas.
P # 64) O que você quer dizer com funções virtuais puras?
Responda: Uma Pure Virtual Member Function é uma função de membro em que a classe base força as classes derivadas a serem substituídas. Normalmente, esta função de membro não tem implementação. Funções puras virtuais são equiparadas a zero.
Exemplo:
class Shape { public: virtual void draw() = 0; };
A classe base que possui uma função virtual pura como seu membro pode ser denominada como uma “classe abstrata”. Esta classe não pode ser instanciada e geralmente atua como um blueprint que possui várias subclasses com implementação adicional.
Q # 65) O que são construtores / destruidores virtuais?
Responda:
Destrutores virtuais: Quando usamos um ponteiro de classe base apontando para um objeto de classe derivada e o usamos para destruí-lo, em vez de chamar o destruidor da classe derivada, o destruidor da classe base é chamado.
Exemplo:
Class A{ …. ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Conforme mostrado no exemplo acima, quando dizemos delete a, o destruidor é chamado, mas na verdade é o destruidor da classe base. Isso dá origem à ambigüidade de que toda a memória mantida por b não será apagada adequadamente.
Este problema pode ser resolvido usando o conceito de “Destruidor Virtual”.
O que fazemos é tornar o construtor da classe base “Virtual” para que todos os destruidores da classe filha também se tornem virtuais e quando excluímos o objeto da classe base apontando para o objeto da classe derivada, o destruidor apropriado é chamado e todos os objetos são devidamente excluídos.
Isso é mostrado da seguinte forma:
programa para baixar vídeos de sites
Class A{ …. virtual ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Construtor virtual : Construtores não podem ser virtuais. Declarar um construtor como uma função virtual é um erro de sintaxe.
Amigo
Q # 66) O que é uma função de amigo?
Responda: A classe C ++ não permite que seus membros privados e protegidos sejam acessados fora da classe. Mas esta regra pode ser violada fazendo uso do “ Amigo ”Função.
Como o próprio nome sugere, a função de amigo é uma função externa amiga da classe. Para que a função friend acesse os métodos privados e protegidos da classe, devemos ter um protótipo da função friend com a palavra-chave “friend” incluída dentro da classe.
Q # 67) O que é uma classe de amigo?
Responda: Classes de amigo são usadas quando precisamos substituir a regra para especificadores de acesso privado e protegido para que duas classes possam trabalhar próximas uma da outra.
Portanto, podemos ter uma turma de amigo para ser amigo de outra turma. Dessa forma, as aulas de amigos podem manter coisas privadas e inacessíveis da maneira como estão.
Quando temos um requisito para acessar a implementação interna de uma classe (membro privado) sem expor os detalhes tornando o público, optamos por funções de amigo.
C ++ avançado
Modelos
Q # 68) O que é um modelo?
Responda: Os modelos permitem a criação de funções independentes do tipo de dados (genérico) e podem receber qualquer tipo de dados como parâmetros e valor de retorno sem ter que sobrecarregar a função com todos os tipos de dados possíveis. Os modelos quase cumprem a funcionalidade de uma macro.
Seu protótipo é qualquer um dos seguintes:
modelo identificar > function_declaration;
modelo identificar > function_declaration;
A única diferença entre os dois protótipos é o uso de classe de palavra-chave ou nome de tipo. Sua funcionalidade básica de ser genérica permanece a mesma.
Manipulação de exceção
Q # 69) O que é tratamento de exceções? O C ++ oferece suporte ao tratamento de exceções?
Responda: Sim, C ++ oferece suporte ao tratamento de exceções.
Não podemos garantir que o código será executado normalmente o tempo todo. Pode haver certas situações que podem forçar o mau funcionamento do código escrito por nós, mesmo que esteja livre de erros. Este mau funcionamento do código é chamado Exceção .
Quando ocorre uma exceção, o compilador deve lançá-la para que saibamos que ocorreu uma exceção. Quando uma exceção é lançada, o compilador deve garantir que ela seja tratada adequadamente, para que o fluxo do programa continue ou termine corretamente. Isso é chamado de tratamento de uma exceção.
Portanto, em C ++, temos três palavras-chave, ou seja, tentar , lançar e pegar que estão em tratamento de exceção.
A sintaxe geral para o bloco de exceção é:
try{ …. # Code that is potentially about to throw exception goes here …. throw exception; } catch(exception type) { … #code to handle exception goes here }
Conforme mostrado acima, o código que pode funcionar mal é colocado no bloco try. Quando o código não funciona bem, uma exceção é lançada. Essa exceção é então capturada no bloco catch e tratada, ou seja, a ação apropriada é executada.
Q # 70) Comentário sobre as exceções do padrão C ++?
Responda: C ++ oferece suporte a algumas exceções padrão que podem ser detectadas se colocarmos o código dentro do bloco try. Essas exceções fazem parte da classe base “ std :: exceção ”. Esta classe é definida no arquivo de cabeçalho C ++.
Alguns exemplos de exceções com suporte por esta classe incluem:
bad_alloc - lançado por ‘novo’
runtime_error - lançado para erros de tempo de execução
bad_typeid - lançado por tipo id
Introdução à biblioteca de modelos padrão
Q # 71) O que é uma Biblioteca de Modelos Padrão (STL)? Quais são os vários tipos de recipientes STL?
Responda: A Standard Template Library (STL) é uma biblioteca de modelos de contêineres aprovada pelo comitê ANSI para inclusão na especificação C ++ padrão. Temos vários tipos de contêineres STL, dependendo de como eles armazenam os elementos.
- Fila, Pilha - Eles são iguais aos tradicionais de fila e pilha e são chamados de contêineres adaptáveis.
- Definir, mapa - Esses são basicamente contêineres que têm pares de chave / valor e são associativos por natureza.
- Vector, e - São de natureza sequencial e têm semelhanças com matrizes.
Q # 72) O que é uma classe Iterator?
Responda: Em C ++, uma classe de contêiner é uma coleção de objetos diferentes.
Se precisarmos percorrer essa coleção de objetos, não podemos fazer isso usando variáveis de índice simples. Portanto, temos uma classe especial em STL chamada de Iterator classe que pode ser usada para percorrer o conteúdo da classe contêiner.
As várias categorias de iteradores incluem iteradores de entrada, iteradores de saída, iteradores de encaminhamento, iteradores bidirecionais, acesso aleatório, etc.
Q # 73) Qual é a diferença entre um Iterador Externo e um Iterador Interno? Descreva uma vantagem do Iterador Externo.
Responda: Um iterador interno é implementado com funções de membro da classe que possui itens para percorrer.
Um iterador externo é implementado como uma classe separada que pode ser associada ao objeto que possui itens para percorrer. A vantagem básica de um iterador externo é que ele é fácil de implementar, pois é implementado como uma classe separada.
Em segundo lugar, como é uma classe diferente, muitos objetos iteradores podem estar ativos simultaneamente.
Leitura adicional => Perguntas da entrevista C #
Conclusão
Quase todos os principais tópicos de codificação e programação da entrevista em C ++ são abordados neste artigo.
Esperamos que qualquer candidato se sinta relaxado após se preparar para uma entrevista usando esta série de perguntas da entrevista.
Tudo de bom para sua entrevista !!
Leitura recomendada
- Perguntas e respostas da entrevista
- Perguntas e respostas da entrevista de teste de ETL
- Algumas perguntas e respostas complicadas de testes manuais
- 25 melhores perguntas e respostas da entrevista de teste do Agile
- Perguntas da entrevista de Spock com respostas (mais populares)
- Algumas perguntas interessantes da entrevista de teste de software
- Mais de 20 perguntas e respostas da entrevista em .NET
- As 32 melhores perguntas e respostas da entrevista de datastage