mirror of https://github.com/xfarrow/lasd.git
Lezione 4 + 1/2
This commit is contained in:
parent
7688efdf80
commit
a0fc2e6e6d
Binary file not shown.
|
@ -0,0 +1,90 @@
|
||||||
|
#include<iostream>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
void testOperators();
|
||||||
|
void testConstructors();
|
||||||
|
|
||||||
|
class Punto{
|
||||||
|
public:
|
||||||
|
float x,y;
|
||||||
|
|
||||||
|
/**** COSTRUTTORI ****/
|
||||||
|
Punto() = default; // costruttore di default;
|
||||||
|
Punto(float x1, float y1){ // costruttore
|
||||||
|
x = x1;
|
||||||
|
y = y1;
|
||||||
|
}
|
||||||
|
Punto(const Punto& puntoDaCopaire){ // costruttore di copia
|
||||||
|
x = puntoDaCopaire.x;
|
||||||
|
y = puntoDaCopaire.y;
|
||||||
|
}
|
||||||
|
Punto(Punto&& puntoDaMuovere) noexcept{ // move constructor
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**** DISTRUTTORE ****/
|
||||||
|
~Punto(){
|
||||||
|
cout<<"BYE!"<<endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**** OPERATORI ****/
|
||||||
|
bool operator==(const Punto& obj) const noexcept{
|
||||||
|
return ((x==obj.x) && (y==obj.y));
|
||||||
|
}
|
||||||
|
int operator[](const uint position){
|
||||||
|
switch (position) {
|
||||||
|
case 0:
|
||||||
|
return x;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
return y;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Punto& operator=(const Punto& p){ // operatore di assegnamento COPY
|
||||||
|
// ?
|
||||||
|
}
|
||||||
|
Punto& operator=(Punto&& p) noexcept{ // operatore di assegnamento MOVE
|
||||||
|
// ?
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ostream& operator<<(ostream& outstr, const Punto& p) {
|
||||||
|
return outstr<<p.x<<";"<<p.y;
|
||||||
|
}
|
||||||
|
istream& operator>>(istream& inputStream, Punto& p){
|
||||||
|
return inputStream>>p.x>>p.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
testConstructors();
|
||||||
|
testOperators();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void testConstructors(){
|
||||||
|
Punto p1; // OK, costruttore di default
|
||||||
|
//Punto px(); // NO! Il compilatore si inceppa (fa eseguire ma non accedere ai dati)
|
||||||
|
Punto p2{}; // OK, costruttore di default
|
||||||
|
Punto p3(1,2); // OK
|
||||||
|
Punto p4(3,4); // OK
|
||||||
|
|
||||||
|
Punto p5(p3); //OK, costruttore di copia
|
||||||
|
Punto p6{p4}; // OK; costruttore di copia
|
||||||
|
cout<<p5<<endl<<p6<<endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void testOperators(){
|
||||||
|
Punto p1,p2;
|
||||||
|
cin>>p1;
|
||||||
|
cout<<"Coordinata X: "<<p1[0]<<" Coordinata Y: "<<p1[1]<<endl;
|
||||||
|
cin>>p2;
|
||||||
|
cout<<"Coordinata X: "<<p2[0]<<" Coordinata Y: "<<p2[1]<<endl;
|
||||||
|
if(p1==p2){
|
||||||
|
cout<<"I due punti sono uguali"<<endl;
|
||||||
|
}else{
|
||||||
|
cout<<"I due punti non sono uguali"<<endl;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
#include<iostream>
|
||||||
|
using namespace std;
|
||||||
|
class ClassName{
|
||||||
|
int defaultVariable; // di default è privata
|
||||||
|
public:
|
||||||
|
int publicVariable;
|
||||||
|
protected:
|
||||||
|
int protectedVariable;
|
||||||
|
private:
|
||||||
|
int privateVariable;
|
||||||
|
};
|
||||||
|
int main(){
|
||||||
|
// Dichiarazione 1
|
||||||
|
ClassName obj;
|
||||||
|
obj.publicVariable = 3;
|
||||||
|
std::cout << obj.publicVariable << '\n';
|
||||||
|
// obj.defaultVariable = 3; // errore, di default è privata
|
||||||
|
// obj.protectedVariable = 3; // errore
|
||||||
|
// obj.privateVariable = 3; // errore
|
||||||
|
|
||||||
|
// Dichiarazione 2
|
||||||
|
ClassName obj2{};
|
||||||
|
obj2.publicVariable = 5;
|
||||||
|
std::cout << obj2.publicVariable << '\n';
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
#include<iostream>
|
||||||
|
using namespace std;
|
||||||
|
class ClassName{
|
||||||
|
public:
|
||||||
|
int x;
|
||||||
|
int* v = new int[10];
|
||||||
|
~ClassName(){ // ~ si fa con ALT GR + ì
|
||||||
|
delete[] v;
|
||||||
|
cout<<"BYE!";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
int main(){
|
||||||
|
ClassName obj;
|
||||||
|
ClassName* ptr = new ClassName();
|
||||||
|
delete ptr; // viene chiamato il distruttore di ClassName per cancellare ptr;
|
||||||
|
return 0; // viene chiamato il distruttore di ClassName per cancellare obj
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
I metodi in C++ sono siffatti:
|
||||||
|
[virtual] type nomeMetodo(parametri) [const] [noexcept] [override] [=assignment]
|
||||||
|
|
||||||
|
virtual:
|
||||||
|
const: il metodo non può modificare le variabili della ClassName
|
||||||
|
noexcept: già visto. Non può sollevare eccezioni pena l'aborto del programma
|
||||||
|
override: il metodo sovrascrive un metodo nella gerarchia
|
||||||
|
assignment: può essere:
|
||||||
|
= 0: pure virtual. A questo livello l'implementazione di questo metodo non esiste
|
||||||
|
= default: ammesso solo per cost. e dist. che dice di creare quelli di default
|
||||||
|
=delete: elimina un metodo precedentemente scritto nella gerarchia
|
||||||
|
|
||||||
|
*/
|
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
g++ -O3 -o main main.cpp
|
|
@ -0,0 +1,225 @@
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// Example 1
|
||||||
|
|
||||||
|
class A {
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
uint size = 0;
|
||||||
|
|
||||||
|
char* str = nullptr;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
A() = default;
|
||||||
|
|
||||||
|
A(uint num) : size(num) {
|
||||||
|
cout << "A new object is created" << endl;
|
||||||
|
// size = num;
|
||||||
|
str = new char[num]();
|
||||||
|
}
|
||||||
|
|
||||||
|
~A() {
|
||||||
|
delete[] str;
|
||||||
|
cout << "The object is destructed" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
char& operator[](const uint idx) {
|
||||||
|
return str[idx];
|
||||||
|
// if (idx < size)
|
||||||
|
// {
|
||||||
|
// return str[idx];
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// throw out_of_range("An unexpected access occurred!");
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const A& obj) const noexcept {
|
||||||
|
if (size == obj.size)
|
||||||
|
{
|
||||||
|
for (uint i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
if (str[i] != obj.str[i])
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend ostream& operator<<(ostream&, const A&);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
ostream& operator<<(ostream& outstr, const A& a) {
|
||||||
|
for (uint i = 0; i < a.size; i++) { cout << i << ": '" << a.str[i] << "' "; }
|
||||||
|
return outstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// // Example 2
|
||||||
|
//
|
||||||
|
// class A {
|
||||||
|
// private:
|
||||||
|
// bool flag = false;
|
||||||
|
// // protected:
|
||||||
|
// public:
|
||||||
|
// A() { cout << "A new base object is created" << endl; }
|
||||||
|
// ~A() { cout << "The base object is destructed" << endl; }
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// class B: public A {
|
||||||
|
// public:
|
||||||
|
// B() { cout << "A new derived object is created" << endl; flag = false; }
|
||||||
|
// ~B() { cout << "The derived object is destructed" << endl; }
|
||||||
|
// };
|
||||||
|
|
||||||
|
// // Example 3
|
||||||
|
|
||||||
|
// class A {
|
||||||
|
// public:
|
||||||
|
// A() { cout << "A new base object is created" << endl; }
|
||||||
|
// ~A() { cout << "The base object is destructed" << endl; } // virtual
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// class B: public A {
|
||||||
|
// public:
|
||||||
|
// B() { cout << "A new derived object is created" << endl; }
|
||||||
|
// ~B() { cout << "The derived object is destructed" << endl; }
|
||||||
|
// };
|
||||||
|
|
||||||
|
// // Example 4
|
||||||
|
//
|
||||||
|
// class A {
|
||||||
|
// protected:
|
||||||
|
// uint size = 0;
|
||||||
|
// public:
|
||||||
|
// A() { cout << "A new base object is created" << endl; }
|
||||||
|
// ~A() { cout << "The base object is destructed" << endl; } // virtual
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// class B: public A { // virtual public A
|
||||||
|
// public:
|
||||||
|
// B() { cout << "A new derived B object is created" << endl; size = 1; }
|
||||||
|
// ~B() { cout << "The derived B object is destructed" << endl; }
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// class C: public A { // virtual public A
|
||||||
|
// public:
|
||||||
|
// C() { cout << "A new derived C object is created" << endl; size = 2; }
|
||||||
|
// ~C() { cout << "The derived C object is destructed" << endl; }
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// class D: public B, C { // public C, B
|
||||||
|
// public:
|
||||||
|
// D() { cout << "A new derived D object is created" << endl; }
|
||||||
|
// ~D() { cout << "The derived D object is destructed" << endl; }
|
||||||
|
// void PrintSize() { cout << size << endl; };
|
||||||
|
// // void PrintSize() const noexcept { cout << B::size << " " << C::size << endl; };
|
||||||
|
// };
|
||||||
|
|
||||||
|
// // Example 5
|
||||||
|
//
|
||||||
|
// class A {
|
||||||
|
// protected:
|
||||||
|
// uint val = 0;
|
||||||
|
// public:
|
||||||
|
//
|
||||||
|
// A() { val++; std::cout << "A " << val << std::endl; }
|
||||||
|
//
|
||||||
|
// A(const A& a) { val = a.val; val += 2000; std::cout << "Copy A " << val << std::endl; }
|
||||||
|
//
|
||||||
|
// ~A() { std::cout << "Delete A " << val << std::endl; }
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// class B : public A { // virtual
|
||||||
|
// public:
|
||||||
|
//
|
||||||
|
// B() { val += 10; std::cout << "B " << val << std::endl; } // Equivalently, you can add ": A()"
|
||||||
|
//
|
||||||
|
// B(const B& b) : A(b) { val += 20000; std::cout << "Copy B " << val << std::endl; } // Remove ": A(b)"
|
||||||
|
//
|
||||||
|
// ~B() { std::cout << "Delete B " << val << std::endl; }
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// class C : public B { // virtual
|
||||||
|
// public:
|
||||||
|
//
|
||||||
|
// C() { val += 100; std::cout << "C " << val << std::endl; } // Equivalently, you can add ": B()".
|
||||||
|
//
|
||||||
|
// C(const C& c) : B(c) { val += 200000; std::cout << "Copy C " << val << std::endl; } // Remove ": B(c)"; Add ": A(c)" when A is virtual in B
|
||||||
|
//
|
||||||
|
// ~C() { std::cout << "Delete C " << val << std::endl; }
|
||||||
|
// };
|
||||||
|
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
// Example 1
|
||||||
|
|
||||||
|
// A* ptr = new A();
|
||||||
|
|
||||||
|
A var1(2); // 0, {}
|
||||||
|
A var2(2);
|
||||||
|
|
||||||
|
cout << "var1: " << var1 << endl;
|
||||||
|
cout << "var2: " << var2 << endl;
|
||||||
|
|
||||||
|
cout << "var1 ?= var2: " << (var1 == var2) << endl;
|
||||||
|
|
||||||
|
var1[0] = 'x';
|
||||||
|
|
||||||
|
cout << "var1: " << var1 << endl;
|
||||||
|
cout << "var2: " << var2 << endl;
|
||||||
|
|
||||||
|
cout << "var1 ?= var2: " << (var1 == var2) << endl;
|
||||||
|
|
||||||
|
var2[1] = 'y';
|
||||||
|
|
||||||
|
cout << "var1: " << var1 << endl;
|
||||||
|
cout << "var2: " << var2 << endl;
|
||||||
|
|
||||||
|
cout << "var1 ?= var2: " << (var1 == var2) << endl;
|
||||||
|
|
||||||
|
var1[1] = 'y';
|
||||||
|
var2[0] = 'x';
|
||||||
|
|
||||||
|
cout << "var1: " << var1 << endl;
|
||||||
|
cout << "var2: " << var2 << endl;
|
||||||
|
|
||||||
|
cout << "var1 ?= var2: " << (var1 == var2) << endl;
|
||||||
|
|
||||||
|
// // Example 2
|
||||||
|
//
|
||||||
|
// B* b = new B();
|
||||||
|
// delete b;
|
||||||
|
// return 0;
|
||||||
|
|
||||||
|
// // Example 3
|
||||||
|
//
|
||||||
|
// A *a = new B();
|
||||||
|
// delete a;
|
||||||
|
// return 0;
|
||||||
|
|
||||||
|
// // Example 4
|
||||||
|
//
|
||||||
|
// D d;
|
||||||
|
// d.PrintSize();
|
||||||
|
|
||||||
|
// // Example 5
|
||||||
|
//
|
||||||
|
// std::cout << std::endl;
|
||||||
|
// C x;
|
||||||
|
// std::cout << std::endl;
|
||||||
|
// C y(x);
|
||||||
|
// std::cout << std::endl;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
g++ -O3 -o main main.cpp
|
|
@ -0,0 +1,135 @@
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// template <typename Data>
|
||||||
|
// class A;
|
||||||
|
//
|
||||||
|
// template <typename Data>
|
||||||
|
// ostream& operator<< (ostream& outstr, const A<Data>& a);
|
||||||
|
|
||||||
|
template <typename Data>
|
||||||
|
class A {
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
uint size = 0;
|
||||||
|
|
||||||
|
Data* str = nullptr;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
A() = default;
|
||||||
|
|
||||||
|
A(uint num) : size(num) {
|
||||||
|
cout << "A new object is created" << endl;
|
||||||
|
str = new Data[num]();
|
||||||
|
}
|
||||||
|
|
||||||
|
~A() {
|
||||||
|
delete[] str;
|
||||||
|
cout << "The object is destructed" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
Data& operator[](const uint idx) {
|
||||||
|
return str[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const A& obj) const noexcept {
|
||||||
|
if (size == obj.size)
|
||||||
|
{
|
||||||
|
for (uint i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
if (str[i] != obj.str[i])
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename DataX>
|
||||||
|
friend ostream& operator<<(ostream&, const A<DataX>&);
|
||||||
|
|
||||||
|
// friend ostream& operator<< <>(ostream&, const A<Data>&);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename Data>
|
||||||
|
ostream& operator<< (ostream& outstr, const A<Data>& a) {
|
||||||
|
for (uint i = 0; i < a.size; i++) { cout << i << ": '" << a.str[i] << "' "; }
|
||||||
|
return outstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
A<char> var1(2);
|
||||||
|
A<char> var2(2);
|
||||||
|
|
||||||
|
cout << "var1: " << var1 << endl;
|
||||||
|
cout << "var2: " << var2 << endl;
|
||||||
|
|
||||||
|
cout << "var1 ?= var2: " << (var1 == var2) << endl;
|
||||||
|
|
||||||
|
var1[0] = 'x';
|
||||||
|
|
||||||
|
cout << "var1: " << var1 << endl;
|
||||||
|
cout << "var2: " << var2 << endl;
|
||||||
|
|
||||||
|
cout << "var1 ?= var2: " << (var1 == var2) << endl;
|
||||||
|
|
||||||
|
var2[1] = 'y';
|
||||||
|
|
||||||
|
cout << "var1: " << var1 << endl;
|
||||||
|
cout << "var2: " << var2 << endl;
|
||||||
|
|
||||||
|
cout << "var1 ?= var2: " << (var1 == var2) << endl;
|
||||||
|
|
||||||
|
var1[1] = 'y';
|
||||||
|
var2[0] = 'x';
|
||||||
|
|
||||||
|
cout << "var1: " << var1 << endl;
|
||||||
|
cout << "var2: " << var2 << endl;
|
||||||
|
|
||||||
|
cout << "var1 ?= var2: " << (var1 == var2) << endl;
|
||||||
|
|
||||||
|
cout << endl << endl;
|
||||||
|
|
||||||
|
A<int> var3(2);
|
||||||
|
A<int> var4(2);
|
||||||
|
|
||||||
|
cout << "var3: " << var3 << endl;
|
||||||
|
cout << "var4: " << var4 << endl;
|
||||||
|
|
||||||
|
cout << "var3 ?= var4: " << (var3 == var4) << endl;
|
||||||
|
|
||||||
|
var3[0] = 10;
|
||||||
|
|
||||||
|
cout << "var3: " << var3 << endl;
|
||||||
|
cout << "var4: " << var4 << endl;
|
||||||
|
|
||||||
|
cout << "var3 ?= var4: " << (var3 == var4) << endl;
|
||||||
|
|
||||||
|
var4[1] = 5;
|
||||||
|
|
||||||
|
cout << "var3: " << var3 << endl;
|
||||||
|
cout << "var4: " << var4 << endl;
|
||||||
|
|
||||||
|
cout << "var3 ?= var4: " << (var3 == var4) << endl;
|
||||||
|
|
||||||
|
var3[1] = 5;
|
||||||
|
var4[0] = 10;
|
||||||
|
|
||||||
|
cout << "var3: " << var3 << endl;
|
||||||
|
cout << "var4: " << var4 << endl;
|
||||||
|
|
||||||
|
cout << "var3 ?= var4: " << (var3 == var4) << endl;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue