目录
17th_class_template
template.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
template<typename T>
class AAA {
private:
T t;
public:
void test_func(const T &t);
void print(void);
};
template<typename T> void AAA<T>::test_func(const T &t)
{
this->t = t;
}
template<typename T>
void AAA<T>::print(void)
{
cout<<t<<endl;
}
int main(int argc, char **argv)
{
AAA<int> a;
a.test_func(1);
a.print();
AAA<double> b;
b.test_func(1.23);
b.print();
return 0;
}
template2.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
template<typename T>
class AAA {
private:
T t;
public:
void test_func(const T &t);
void print(void);
};
template<typename T> void AAA<T>::test_func(const T &t)
{
this->t = t;
}
template<typename T>
void AAA<T>::print(void)
{
cout<<t<<endl;
}
template<>
class AAA<int> {
public:
void test_func_int(const int & t)
{
cout<<t<<endl;
}
void print_int(void);
};
void AAA<int>::print_int(void)
{
cout<<"for test"<<endl;
}
int main(int argc, char **argv)
{
AAA<int> a;
a.test_func_int(1);
a.print_int();
AAA<double> b;
b.test_func(1.23);
b.print();
return 0;
}
exception.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
void C()
{
throw 1;
}
void B()
{
C();
}
void A()
{
try {
B();
} catch (int i)
{
cout<<"catch exception "<<i<<endl;
}
}
int main(int argc, char **argv)
{
A();
return 0;
}
exception2.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
void C(int i)
{
int a = 1;
double b= 1.2;
float c = 1.3;
if (i == 0)
{
cout<<"In C, it is OK"<<endl;
}
else if (i == 1)
throw a;
else if (i == 2)
throw b;
else
throw c;
}
void B(int i)
{
cout<<"call C ..."<<endl;
C(i);
cout<<"After call C"<<endl;
}
void A(int i)
{
try {
B(i);
} catch (int j)
{
cout<<"catch exception "<<j<<endl;
}
}
int main(int argc, char **argv)
{
int i;
if (argc != 2)
{
cout<<"Usage: "<<endl;
cout<<argv[0]<<" <0|1|2|3>"<<endl;
return -1;
}
i = strtoul(argv[1], NULL, 0);
A(i);
return 0;
}
exception3.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
void C(int i)
{
int a = 1;
double b= 1.2;
float c = 1.3;
if (i == 0)
{
cout<<"In C, it is OK"<<endl;
}
else if (i == 1)
throw a;
else if (i == 2)
throw b;
else
throw c;
}
void B(int i)
{
cout<<"call C ..."<<endl;
C(i);
cout<<"After call C"<<endl;
}
void A(int i)
{
try {
B(i);
} catch (int j)
{
cout<<"catch int exception "<<j<<endl;
} catch (double d)
{
cout<<"catch double exception "<<d<<endl;
} catch (...){
cout<<"catch other exception "<<endl;
}
}
int main(int argc, char **argv)
{
int i;
if (argc != 2)
{
cout<<"Usage: "<<endl;
cout<<argv[0]<<" <0|1|2|3>"<<endl;
return -1;
}
i = strtoul(argv[1], NULL, 0);
A(i);
return 0;
}
exception4.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
class MyException {
public:
void what(void) { cout<<"This is MyException"<<endl; }
};
void C(int i)
{
int a = 1;
double b= 1.2;
float c = 1.3;
if (i == 0)
{
cout<<"In C, it is OK"<<endl;
}
else if (i == 1)
throw a;
else if (i == 2)
throw b;
else if (i == 3)
throw c;
else if (i == 4)
throw MyException();
}
void B(int i)
{
cout<<"call C ..."<<endl;
C(i);
cout<<"After call C"<<endl;
}
void A(int i)
{
try {
B(i);
} catch (int j)
{
cout<<"catch int exception "<<j<<endl;
} catch (double d)
{
cout<<"catch double exception "<<d<<endl;
} catch (MyException &e)
{
e.what();
} catch (...){
cout<<"catch other exception "<<endl;
}
}
int main(int argc, char **argv)
{
int i;
if (argc != 2)
{
cout<<"Usage: "<<endl;
cout<<argv[0]<<" <0|1|2|3>"<<endl;
return -1;
}
i = strtoul(argv[1], NULL, 0);
A(i);
return 0;
}
exception5.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
class MyException {
public:
void what(void) { cout<<"This is MyException"<<endl; }
};
class MySubException : public MyException{
public:
void what(void) { cout<<"This is MySubException"<<endl; }
};
void C(int i)
{
int a = 1;
double b= 1.2;
float c = 1.3;
if (i == 0)
{
cout<<"In C, it is OK"<<endl;
}
else if (i == 1)
throw a;
else if (i == 2)
throw b;
else if (i == 3)
throw c;
else if (i == 4)
throw MyException();
else if (i == 5)
throw MySubException();
}
void B(int i)
{
cout<<"call C ..."<<endl;
C(i);
cout<<"After call C"<<endl;
}
void A(int i)
{
try {
B(i);
} catch (int j)
{
cout<<"catch int exception "<<j<<endl;
} catch (double d)
{
cout<<"catch double exception "<<d<<endl;
} catch (MySubException &e)
{
e.what();
} catch (MyException &e)
{
e.what();
} catch (...){
cout<<"catch other exception "<<endl;
}
}
int main(int argc, char **argv)
{
int i;
if (argc != 2)
{
cout<<"Usage: "<<endl;
cout<<argv[0]<<" <0|1|2|3>"<<endl;
return -1;
}
i = strtoul(argv[1], NULL, 0);
A(i);
return 0;
}
exception6.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
class MyException {
public:
virtual void what(void) { cout<<"This is MyException"<<endl; }
};
class MySubException : public MyException{
public:
void what(void) { cout<<"This is MySubException"<<endl; }
};
void C(int i)
{
int a = 1;
double b= 1.2;
float c = 1.3;
if (i == 0)
{
cout<<"In C, it is OK"<<endl;
}
else if (i == 1)
throw a;
else if (i == 2)
throw b;
else if (i == 3)
throw c;
else if (i == 4)
throw MyException();
else if (i == 5)
throw MySubException();
}
void B(int i)
{
cout<<"call C ..."<<endl;
C(i);
cout<<"After call C"<<endl;
}
void A(int i)
{
try {
B(i);
} catch (int j)
{
cout<<"catch int exception "<<j<<endl;
} catch (double d)
{
cout<<"catch double exception "<<d<<endl;
} catch (MyException &e)
{
e.what();
} catch (...){
cout<<"catch other exception "<<endl;
}
}
int main(int argc, char **argv)
{
int i;
if (argc != 2)
{
cout<<"Usage: "<<endl;
cout<<argv[0]<<" <0|1|2|3>"<<endl;
return -1;
}
i = strtoul(argv[1], NULL, 0);
A(i);
return 0;
}
exception7.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
class MyException {
public:
virtual void what(void) { cout<<"This is MyException"<<endl; }
};
class MySubException : public MyException{
public:
void what(void) { cout<<"This is MySubException"<<endl; }
};
void C(int i) throw(int, double)
{
int a = 1;
double b= 1.2;
float c = 1.3;
if (i == 0)
{
cout<<"In C, it is OK"<<endl;
}
else if (i == 1)
throw a;
else if (i == 2)
throw b;
else if (i == 3)
throw c;
else if (i == 4)
throw MyException();
else if (i == 5)
throw MySubException();
}
void B(int i)
{
cout<<"call C ..."<<endl;
C(i);
cout<<"After call C"<<endl;
}
void A(int i)
{
try {
B(i);
} catch (int j)
{
cout<<"catch int exception "<<j<<endl;
} catch (double d)
{
cout<<"catch double exception "<<d<<endl;
} catch (MyException &e)
{
e.what();
} catch (...){
cout<<"catch other exception "<<endl;
}
}
void my_unexpected_func()
{
cout<<"my_unexpected_func"<<endl;
}
void my_terminate_func () { cout<<"my_terminate_func"<<endl; }
int main(int argc, char **argv)
{
int i;
set_unexpected (my_unexpected_func);
set_terminate(my_terminate_func);
if (argc != 2)
{
cout<<"Usage: "<<endl;
cout<<argv[0]<<" <0|1|2|3>"<<endl;
return -1;
}
i = strtoul(argv[1], NULL, 0);
A(i);
return 0;
}
exception8.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
class MyException {
public:
virtual void what(void) { cout<<"This is MyException"<<endl; }
};
class MySubException : public MyException{
public:
void what(void) { cout<<"This is MySubException"<<endl; }
};
void C(int i) throw(int, double)
{
int a = 1;
double b= 1.2;
float c = 1.3;
if (i == 0)
{
cout<<"In C, it is OK"<<endl;
}
else if (i == 1)
throw a;
else if (i == 2)
throw b;
else if (i == 3)
throw c;
else if (i == 4)
throw MyException();
else if (i == 5)
throw MySubException();
}
void B(int i)
{
cout<<"call C ..."<<endl;
C(i);
cout<<"After call C"<<endl;
}
void A(int i)
{
try {
B(i);
} catch (int j)
{
cout<<"catch int exception "<<j<<endl;
} catch (MyException &e)
{
e.what();
}
}
void my_unexpected_func()
{
cout<<"my_unexpected_func"<<endl;
}
void my_terminate_func () { cout<<"my_terminate_func"<<endl; }
int main(int argc, char **argv)
{
int i;
set_unexpected (my_unexpected_func);
set_terminate(my_terminate_func);
if (argc != 2)
{
cout<<"Usage: "<<endl;
cout<<argv[0]<<" <0|1|2|3>"<<endl;
return -1;
}
i = strtoul(argv[1], NULL, 0);
A(i);
return 0;
}
18th_exception
exception.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
void C()
{
throw 1;
}
void B()
{
C();
}
void A()
{
try {
B();
} catch (int i)
{
cout<<"catch exception "<<i<<endl;
}
}
int main(int argc, char **argv)
{
A();
return 0;
}
exception2.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
void C(int i)
{
int a = 1;
double b= 1.2;
float c = 1.3;
if (i == 0)
{
cout<<"In C, it is OK"<<endl;
}
else if (i == 1)
throw a;
else if (i == 2)
throw b;
else
throw c;
}
void B(int i)
{
cout<<"call C ..."<<endl;
C(i);
cout<<"After call C"<<endl;
}
void A(int i)
{
try {
B(i);
} catch (int j)
{
cout<<"catch exception "<<j<<endl;
}
}
int main(int argc, char **argv)
{
int i;
if (argc != 2)
{
cout<<"Usage: "<<endl;
cout<<argv[0]<<" <0|1|2|3>"<<endl;
return -1;
}
i = strtoul(argv[1], NULL, 0);
A(i);
return 0;
}
exception3.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
void C(int i)
{
int a = 1;
double b= 1.2;
float c = 1.3;
if (i == 0)
{
cout<<"In C, it is OK"<<endl;
}
else if (i == 1)
throw a;
else if (i == 2)
throw b;
else
throw c;
}
void B(int i)
{
cout<<"call C ..."<<endl;
C(i);
cout<<"After call C"<<endl;
}
void A(int i)
{
try {
B(i);
} catch (int j)
{
cout<<"catch int exception "<<j<<endl;
} catch (double d)
{
cout<<"catch double exception "<<d<<endl;
} catch (...){
cout<<"catch other exception "<<endl;
}
}
int main(int argc, char **argv)
{
int i;
if (argc != 2)
{
cout<<"Usage: "<<endl;
cout<<argv[0]<<" <0|1|2|3>"<<endl;
return -1;
}
i = strtoul(argv[1], NULL, 0);
A(i);
return 0;
}
exception4.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
class MyException {
public:
void what(void) { cout<<"This is MyException"<<endl; }
};
void C(int i)
{
int a = 1;
double b= 1.2;
float c = 1.3;
if (i == 0)
{
cout<<"In C, it is OK"<<endl;
}
else if (i == 1)
throw a;
else if (i == 2)
throw b;
else if (i == 3)
throw c;
else if (i == 4)
throw MyException();
}
void B(int i)
{
cout<<"call C ..."<<endl;
C(i);
cout<<"After call C"<<endl;
}
void A(int i)
{
try {
B(i);
} catch (int j)
{
cout<<"catch int exception "<<j<<endl;
} catch (double d)
{
cout<<"catch double exception "<<d<<endl;
} catch (MyException &e)
{
e.what();
} catch (...){
cout<<"catch other exception "<<endl;
}
}
int main(int argc, char **argv)
{
int i;
if (argc != 2)
{
cout<<"Usage: "<<endl;
cout<<argv[0]<<" <0|1|2|3>"<<endl;
return -1;
}
i = strtoul(argv[1], NULL, 0);
A(i);
return 0;
}
exception5.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
class MyException {
public:
void what(void) { cout<<"This is MyException"<<endl; }
};
class MySubException : public MyException{
public:
void what(void) { cout<<"This is MySubException"<<endl; }
};
void C(int i)
{
int a = 1;
double b= 1.2;
float c = 1.3;
if (i == 0)
{
cout<<"In C, it is OK"<<endl;
}
else if (i == 1)
throw a;
else if (i == 2)
throw b;
else if (i == 3)
throw c;
else if (i == 4)
throw MyException();
else if (i == 5)
throw MySubException();
}
void B(int i)
{
cout<<"call C ..."<<endl;
C(i);
cout<<"After call C"<<endl;
}
void A(int i)
{
try {
B(i);
} catch (int j)
{
cout<<"catch int exception "<<j<<endl;
} catch (double d)
{
cout<<"catch double exception "<<d<<endl;
} catch (MySubException &e)
{
e.what();
} catch (MyException &e)
{
e.what();
} catch (...){
cout<<"catch other exception "<<endl;
}
}
int main(int argc, char **argv)
{
int i;
if (argc != 2)
{
cout<<"Usage: "<<endl;
cout<<argv[0]<<" <0|1|2|3>"<<endl;
return -1;
}
i = strtoul(argv[1], NULL, 0);
A(i);
return 0;
}
exception6.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
class MyException {
public:
virtual void what(void) { cout<<"This is MyException"<<endl; }
};
class MySubException : public MyException{
public:
void what(void) { cout<<"This is MySubException"<<endl; }
};
void C(int i)
{
int a = 1;
double b= 1.2;
float c = 1.3;
if (i == 0)
{
cout<<"In C, it is OK"<<endl;
}
else if (i == 1)
throw a;
else if (i == 2)
throw b;
else if (i == 3)
throw c;
else if (i == 4)
throw MyException();
else if (i == 5)
throw MySubException();
}
void B(int i)
{
cout<<"call C ..."<<endl;
C(i);
cout<<"After call C"<<endl;
}
void A(int i)
{
try {
B(i);
} catch (int j)
{
cout<<"catch int exception "<<j<<endl;
} catch (double d)
{
cout<<"catch double exception "<<d<<endl;
} catch (MyException &e)
{
e.what();
} catch (...){
cout<<"catch other exception "<<endl;
}
}
int main(int argc, char **argv)
{
int i;
if (argc != 2)
{
cout<<"Usage: "<<endl;
cout<<argv[0]<<" <0|1|2|3>"<<endl;
return -1;
}
i = strtoul(argv[1], NULL, 0);
A(i);
return 0;
}
exception7.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
class MyException {
public:
virtual void what(void) { cout<<"This is MyException"<<endl; }
};
class MySubException : public MyException{
public:
void what(void) { cout<<"This is MySubException"<<endl; }
};
void C(int i) throw(int, double)
{
int a = 1;
double b= 1.2;
float c = 1.3;
if (i == 0)
{
cout<<"In C, it is OK"<<endl;
}
else if (i == 1)
throw a;
else if (i == 2)
throw b;
else if (i == 3)
throw c;
else if (i == 4)
throw MyException();
else if (i == 5)
throw MySubException();
}
void B(int i)
{
cout<<"call C ..."<<endl;
C(i);
cout<<"After call C"<<endl;
}
void A(int i)
{
try {
B(i);
} catch (int j)
{
cout<<"catch int exception "<<j<<endl;
} catch (double d)
{
cout<<"catch double exception "<<d<<endl;
} catch (MyException &e)
{
e.what();
} catch (...){
cout<<"catch other exception "<<endl;
}
}
void my_unexpected_func()
{
cout<<"my_unexpected_func"<<endl;
}
void my_terminate_func () { cout<<"my_terminate_func"<<endl; }
int main(int argc, char **argv)
{
int i;
set_unexpected (my_unexpected_func);
set_terminate(my_terminate_func);
if (argc != 2)
{
cout<<"Usage: "<<endl;
cout<<argv[0]<<" <0|1|2|3>"<<endl;
return -1;
}
i = strtoul(argv[1], NULL, 0);
A(i);
return 0;
}
exception8.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
class MyException {
public:
virtual void what(void) { cout<<"This is MyException"<<endl; }
};
class MySubException : public MyException{
public:
void what(void) { cout<<"This is MySubException"<<endl; }
};
void C(int i) throw(int, double)
{
int a = 1;
double b= 1.2;
float c = 1.3;
if (i == 0)
{
cout<<"In C, it is OK"<<endl;
}
else if (i == 1)
throw a;
else if (i == 2)
throw b;
else if (i == 3)
throw c;
else if (i == 4)
throw MyException();
else if (i == 5)
throw MySubException();
}
void B(int i)
{
cout<<"call C ..."<<endl;
C(i);
cout<<"After call C"<<endl;
}
void A(int i)
{
try {
B(i);
} catch (int j)
{
cout<<"catch int exception "<<j<<endl;
} catch (MyException &e)
{
e.what();
}
}
void my_unexpected_func()
{
cout<<"my_unexpected_func"<<endl;
}
void my_terminate_func () { cout<<"my_terminate_func"<<endl; }
int main(int argc, char **argv)
{
int i;
set_unexpected (my_unexpected_func);
set_terminate(my_terminate_func);
if (argc != 2)
{
cout<<"Usage: "<<endl;
cout<<argv[0]<<" <0|1|2|3>"<<endl;
return -1;
}
i = strtoul(argv[1], NULL, 0);
A(i);
return 0;
}
19th_smartpointer
person.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
class Person {
public:
Person() {
cout <<"Pserson()"<<endl;
}
~Person()
{
cout << "~Person()"<<endl;
}
void printInfo(void)
{
cout<<"just a test function"<<endl;
}
};
void test_func(void)
{
Person *p = new Person();
p->printInfo();
}
int main(int argc, char **argv)
{
int i;
for (i = 0; i < 2; i++)
test_func();
return 0;
}
person2.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
class Person {
public:
Person() {
cout <<"Pserson()"<<endl;
}
~Person()
{
cout << "~Person()"<<endl;
}
void printInfo(void)
{
cout<<"just a test function"<<endl;
}
};
void test_func(void)
{
//Person *p = new Person();
Person per;
per.printInfo();
}
int main(int argc, char **argv)
{
int i;
for (i = 0; i < 2; i++)
test_func();
return 0;
}
person3.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
class Person {
public:
Person() {
cout <<"Pserson()"<<endl;
}
~Person()
{
cout << "~Person()"<<endl;
}
void printInfo(void)
{
cout<<"just a test function"<<endl;
}
};
class sp {
private:
Person *p;
public:
sp() : p(0) {}
sp(Person *other)
{
cout<<"sp(const Person *other)"<<endl;
p = other;
}
~sp()
{
cout<<"~sp()"<<endl;
if (p)
delete p;
}
Person *operator->()
{
return p;
}
};
void test_func(void)
{
sp s = new Person();
s->printInfo();
//Person *p = new Person();
//p->printInfo();
//delete p;
}
int main(int argc, char **argv)
{
int i;
for (i = 0; i < 2; i++)
test_func();
return 0;
}
person4.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
class Person {
public:
Person() {
cout <<"Pserson()"<<endl;
}
~Person()
{
cout << "~Person()"<<endl;
}
void printInfo(void)
{
cout<<"just a test function"<<endl;
}
};
class sp {
private:
Person *p;
public:
sp() : p(0) {}
sp(Person *other)
{
cout<<"sp(const Person *other)"<<endl;
p = other;
}
sp(sp &other)
{
cout<<"sp(const Person *other)"<<endl;
p = other.p;
}
~sp()
{
cout<<"~sp()"<<endl;
if (p)
delete p;
}
Person *operator->()
{
return p;
}
};
void test_func(sp &other)
{
sp s = other;
s->printInfo();
//Person *p = new Person();
//p->printInfo();
//delete p;
}
int main(int argc, char **argv)
{
int i;
/* 相当于:
* 1. Person *p = new Person();
* 2. sp tmp(p); ==> sp(Person *other)
* 3.
* 3.1 sp other(tmp); ==> sp(sp &other2)
问题在于: sp &other2 = tmp; // 错误语法
const sp& other2 = tmp; //ok
* 或
* 3.2 sp other(tmp ==> Person*); ==>sp(Person *other)
*/
sp other = new Person();
for (i = 0; i < 2; i++)
test_func(other);
return 0;
}
person5.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
class Person {
public:
Person() {
cout <<"Pserson()"<<endl;
}
~Person()
{
cout << "~Person()"<<endl;
}
void printInfo(void)
{
cout<<"just a test function"<<endl;
}
};
class sp {
private:
Person *p;
public:
sp() : p(0) {}
sp(Person *other)
{
cout<<"sp(Person *other)"<<endl;
p = other;
}
sp(const sp &other)
{
cout<<"sp(const sp &other)"<<endl;
p = other.p;
}
~sp()
{
cout<<"~sp()"<<endl;
if (p)
delete p;
}
Person *operator->()
{
return p;
}
};
void test_func(sp &other)
{
sp s = other;
s->printInfo();
//Person *p = new Person();
//p->printInfo();
//delete p;
}
int main(int argc, char **argv)
{
int i;
sp other = new Person();
for (i = 0; i < 2; i++)
test_func(other);
return 0;
}
person6.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
class Person {
private:
int count;
public:
void incStrong(){ count++; }
void decStrong(){ count--; }
int getStrongCount(){ return count;}
Person() : count(0){
cout <<"Pserson()"<<endl;
}
~Person()
{
cout << "~Person()"<<endl;
}
void printInfo(void)
{
cout<<"just a test function"<<endl;
}
};
class sp {
private:
Person *p;
public:
sp() : p(0) {}
sp(Person *other)
{
cout<<"sp(Person *other)"<<endl;
p = other;
p->incStrong();
}
sp(const sp &other)
{
cout<<"sp(const sp &other)"<<endl;
p = other.p;
p->incStrong();
}
~sp()
{
cout<<"~sp()"<<endl;
if (p)
{
p->decStrong();
if (p->getStrongCount() == 0)
{
delete p;
p = NULL;
}
}
}
Person *operator->()
{
return p;
}
};
void test_func(sp &other)
{
sp s = other;
cout<<"In test_func: "<<s->getStrongCount()<<endl;
s->printInfo();
//Person *p = new Person();
//p->printInfo();
//delete p;
}
int main(int argc, char **argv)
{
int i;
sp other = new Person();
cout<<"Before call test_func: "<<other->getStrongCount()<<endl;
for (i = 0; i < 2; i++)
{
test_func(other);
cout<<"After call test_func: "<<other->getStrongCount()<<endl;
}
return 0;
}
person7.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
class Person {
private:
int count;
public:
void incStrong(){ count++; }
void decStrong(){ count--; }
int getStrongCount(){ return count;}
Person() : count(0){
cout <<"Pserson()"<<endl;
}
~Person()
{
cout << "~Person()"<<endl;
}
void printInfo(void)
{
cout<<"just a test function"<<endl;
}
};
class sp {
private:
Person *p;
public:
sp() : p(0) {}
sp(Person *other)
{
cout<<"sp(Person *other)"<<endl;
p = other;
p->incStrong();
}
sp(const sp &other)
{
cout<<"sp(const sp &other)"<<endl;
p = other.p;
p->incStrong();
}
~sp()
{
cout<<"~sp()"<<endl;
if (p)
{
p->decStrong();
if (p->getStrongCount() == 0)
{
delete p;
p = NULL;
}
}
}
Person *operator->()
{
return p;
}
Person& operator*()
{
return *p;
}
};
void test_func(sp &other)
{
sp s = other;
cout<<"In test_func: "<<s->getStrongCount()<<endl;
s->printInfo();
//Person *p = new Person();
//p->printInfo();
//delete p;
}
int main(int argc, char **argv)
{
int i;
/* 少用"Person *"; 用"sp"来代替"Person *"
* Person *per;
* 有2种操作: per->XXXx, (*per).XXX
* sp也应该有这2中操作:
* sp->XXX, (*sp).XXX
*
*/
sp other = new Person();
(*other).printInfo();
cout<<"Before call test_func: "<<other->getStrongCount()<<endl;
for (i = 0; i < 2; i++)
{
test_func(other);
cout<<"After call test_func: "<<other->getStrongCount()<<endl;
}
return 0;
}
person8.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
class RefBase {
private:
int count;
public:
RefBase() : count(0) {}
void incStrong(){ count++; }
void decStrong(){ count--; }
int getStrongCount(){ return count;}
};
class Person : public RefBase{
public:
Person() {
cout <<"Pserson()"<<endl;
}
~Person()
{
cout << "~Person()"<<endl;
}
void printInfo(void)
{
cout<<"just a test function"<<endl;
}
};
class sp {
private:
Person *p;
public:
sp() : p(0) {}
sp(Person *other)
{
cout<<"sp(Person *other)"<<endl;
p = other;
p->incStrong();
}
sp(const sp &other)
{
cout<<"sp(const sp &other)"<<endl;
p = other.p;
p->incStrong();
}
~sp()
{
cout<<"~sp()"<<endl;
if (p)
{
p->decStrong();
if (p->getStrongCount() == 0)
{
delete p;
p = NULL;
}
}
}
Person *operator->()
{
return p;
}
Person& operator*()
{
return *p;
}
};
void test_func(sp &other)
{
sp s = other;
cout<<"In test_func: "<<s->getStrongCount()<<endl;
s->printInfo();
//Person *p = new Person();
//p->printInfo();
//delete p;
}
int main(int argc, char **argv)
{
int i;
/* 少用"Person *"; 用"sp"来代替"Person *"
* Person *per;
* 有2种操作: per->XXXx, (*per).XXX
* sp也应该有这2中操作:
* sp->XXX, (*sp).XXX
*
*/
sp other = new Person();
(*other).printInfo();
cout<<"Before call test_func: "<<other->getStrongCount()<<endl;
for (i = 0; i < 2; i++)
{
test_func(other);
cout<<"After call test_func: "<<other->getStrongCount()<<endl;
}
return 0;
}
person9.cpp
cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
class RefBase {
private:
int count;
public:
RefBase() : count(0) {}
void incStrong(){ count++; }
void decStrong(){ count--; }
int getStrongCount(){ return count;}
};
class Person : public RefBase{
public:
Person() {
cout <<"Pserson()"<<endl;
}
~Person()
{
cout << "~Person()"<<endl;
}
void printInfo(void)
{
cout<<"just a test function"<<endl;
}
};
template<typename T>
class sp {
private:
T *p;
public:
sp() : p(0) {}
sp(T *other)
{
cout<<"sp(T *other)"<<endl;
p = other;
p->incStrong();
}
sp(const sp &other)
{
cout<<"sp(const sp &other)"<<endl;
p = other.p;
p->incStrong();
}
~sp()
{
cout<<"~sp()"<<endl;
if (p)
{
p->decStrong();
if (p->getStrongCount() == 0)
{
delete p;
p = NULL;
}
}
}
T *operator->()
{
return p;
}
T& operator*()
{
return *p;
}
};
template<typename T>
void test_func(sp<T> &other)
{
sp<T> s = other;
cout<<"In test_func: "<<s->getStrongCount()<<endl;
s->printInfo();
//Person *p = new Person();
//p->printInfo();
//delete p;
}
int main(int argc, char **argv)
{
int i;
/* 少用"Person *"; 用"sp<Person>"来代替"Person *"
* Person *per;
* 有2种操作: per->XXXx, (*per).XXX
* sp也应该有这2中操作:
* sp->XXX, (*sp).XXX
*
*/
sp<Person> other = new Person();
(*other).printInfo();
cout<<"Before call test_func: "<<other->getStrongCount()<<endl;
for (i = 0; i < 2; i++)
{
test_func(other);
cout<<"After call test_func: "<<other->getStrongCount()<<endl;
}
return 0;
}