Q1. Betrachten Sie diese Funktionsdeklaration von is_even
, die einen ganzzahligen Wert nimmt und "wahr" zurückgibt, wenn das Argument eine gerade Zahl ist, ansonsten "falsch". Welche Deklarationen sind korrekt für überladene Versionen dieser Funktion, um auch Gleitkomma- und String-Darstellungen von Zahlen zu unterstützen?
bool is_even(int);
- A
bool is_even(float f);
bool is_even(char *str);
- B
bool is_even(float f);
bool is_even(char str);
- C
bool is_even_float(float f);
bool is_even_str(char *str);
- D
float is_even(float f);
char *is_even(char *str);
int c=3; char d='A';
std::printf("c is %d and d is %c",c,d);
- c is d and d is c
- c is A and d is 3
- c is 3 and d is A
- c is c and d is d
if(x)
y=a;
else
y=b;
-
y=a?b:x;
-
y=if(x?a:b);
-
y=(x&a)?a:(x&b)?b:0;
-
y=x?a:b;
using namespace std;
- Wenn der Code eine Funktion aufruft, die in zwei verschiedenen Bibliotheken mit demselben Prototypen, aber womöglich unterschiedlichen Implementierungen definiert ist, tritt wegen Mehrdeutigkeit ein Kompilierfehler auf.
- Sie bindet automatisch alle Headerdateien in die Standardbibliothek ein (cstdint, cstdlib, cstdio, iostream usw.).
- Sie veranlasst den Compiler dazu zu erzwingen, dass ausschließlich Headerdateien aus der Standardbibliothek eingebunden werden, und führt zu Kompilierfehlern, wenn eine andere Headerdatei eingebunden wird.
- Der kopilierte Code ist wegen all der importierten Symbole immer größer.
- Er berechnet das bitweise xor zwischen seinen Operanden.
- Er berechnet das logische xor zwischen seinen Operanden.
- Er nimmt die linke Seite des Operators hoch der Potenz auf der rechten Seite des Operators.
- Er tut zweierlei: Er deklariert einen Zeiger und dereferenziert einen Zeiger.
union {
unit16_t a;
unit32_t b;
int8_t c;
} u1;
- 4 Bytes
- 7 Bytes
- 8 Bytes
- 2 Bytes
#include <iostream>
char str[20]="Hi, there!";
int main(){
char *p=&str[4];
std::count<<*p++;
std::count<<p;
return 0;
}
- tthere!
- uhere!
- there!
- tuhere!
- void* operator conditional(const bool cond, const void& iftrue, const void& iffalse);
- void& operator ?:(const bool cond, const void& iftrue, const void& iffalse);
- Der ternäre Operator kann nicht überladen werden.
- void* operator ?:(const bool cond, const void* iftrue, const void* iffalse);
Q9. Welche Option zeigt den Inhalt der Vektoren, auf die v1 und v2 zeigen, nach der Ausführung dieses Codes?
std:: vector<int> *v1 = new std::vector<int>({1,2,3});
std:: vector<int> *v2;
v2=v1;
v1->push_back(4);
v2->push_back(5);
-
*v1:{1,2,3,4}; *v2:{5};
-
*v1:{1,2,3,4,5}; *v2:{1,2,3,4,5};
- Error
-
*v1:{1,2,3,4}; *v2:{1,2,3,5};
v1 und v2 zeigen auf denselben Vektor.
class my_array{
public:
int count();
}; // ... weitere Member darüber
int main(){
my_array *grades = new my_array();
}; // ... weitere Code darüber
-
grades.count();
-
my_array->count();
-
grades->count();
-
my_array.count();
- Damit kann beim Programmieren der nötige Code geschrieben werden, um die vom Objekt belegten Ressourcen freizugeben, bevor das Objekt selbst gelöscht wird.
- Er löscht ein Object. Ein Beispiel eines Zerstörers ist die Funktion
delete()
- Er beendet ein Programm. Das kann mit einem regulären Funktionsaufruf oder mit einer Ausnahme erreichen werden.
- Es gibt keine Zerstörer in C++.
my_class *my_object = new my_class();
-
delete(my_object);
-
free(my_object);
- Der Speicherbereiniger wird das Object irgendwann zerstören.
- Das Object wird zerstört, wenn der Gültigkeitsbereich verlassen wird.
Q13. Warum ist es nicht möglich, ein Array von Verweisen, einen Zeiger auf einen Verweis oder einen Verweis auf einen Verweis zu deklarieren?
- Verweise sind Zeiger und keiner der genannten Typen ist für Zeiger sinnvoll.
- Tatsächlich ist das möglich, aber diese Typen müssen bei der Deklaration als
const
odervolatile
spezifiziert werden. - Verweise sind weder Objekte noch Variablen, daher ist nicht garantiert, dass sie Speicher belegen und eine Adresse haben.
- Verweise müssen initialisiert werden, damit sie bei der Deklaration auf ein gültiges Objekt oder eine gültige Funktion verweisen.
void *ptr;
- Sie ist ein mit NULL initialisierter Zeiger.
- Sie ist ein Zeiger auf eine Void-Funktion.
- Diese Deklaration verursacht einen Kompilierfehler, weil Zeiger immer einen Typ angeben müssen.
- Da sie ein Zeiger auf einen Wert ohne spezifischen Typ ist, kann sie per Typumwandlung als Zeiger auf jeden Typ genutzt werden.
- durch Verwendung von extern "C"
- indem er den C-Quellcode importiert
- Es gibt keine Möglichkeit, mit C++ eine C-Funktion aufzurufen.
- indem er einfach den C-Code aufruft