1. TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN CÔNG NGHỆ PHẦN MỀM
HỆ CHÍNH QUI
MÔN: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
GVLT: ThS. ĐẶNG BÌNH PHƯƠNG
HƯỚNG DẪN THỰC HÀNH
TUẦN 04 – ATTRIBUTE & METHOD
TRẦN THANH HẢI
ĐẶNG ĐĂNG KHOA
HỒ TUẤN THANH
TP.HCM, ngày 15 tháng 10 năm 2012
2. tthai/ddkhoa/htthanh@fit.hcmus.edu.vn
Trang 2
MỤC LỤC
1 Bài tập...........................................................................................................................3
2 Bài tập trên lớp..............................................................................................................3
3 Bài tập về nhà ...............................................................................................................9
3. tthai/ddkhoa/htthanh@fit.hcmus.edu.vn
Trang 3
1 Bài tập
Hoàn thành các bài tập dưới đây, tuân thủ các qui tắc lập trình đã học trong 2 môn năm
nhất:
1. Qui tắc đặt tên
2. Qui tắc viết code
3. Qui tắc ghi chú (ghi chú mỗi project và ghi chú mỗi hàm)
4. Qui tắc chia file (.h và .cpp)
5. Qui tắc bố trí project (1 solution, n projects: Bai01, Bai02, …)
2 Bài tập trên lớp
1. Viết chương trình chứa các đoạn mã nguồn bên dưới. Kiểm tra chúng có biên dịch
hay thực thi thành công hay không. Giải thích.
// 1.
int i = 12;
const int ci = 12;
int *ip1 = &12;
12 = 13;
const int *ip2 = &ci;
ci = 13;
const int *ip3 = &i;
i = 10;
*ip3 = 10;
// 2.
const char *pci;
char * const cpi = 0;
char const *pci2;
const char * const cpci = 0;
char *ip;
int i = strlen( cpi );
pci = ip;
ip = pci;
// 3.
char **ppc;
const char **ppcc = ppc;
// 4.
int * * * const cnnn = 0;
int * * const * ncnn = 0;
int * const * * nncn = 0;
int * const * const * nccn = 0;
const int * * * nnnc = 0;
4. tthai/ddkhoa/htthanh@fit.hcmus.edu.vn
Trang 4
ncnn = cnnn;
nncn = cnnn;
nccn = cnnn;
ncnn = cnnn;
nnnc = cnnn;
2. Viết chương trình chứa các đoạn mã nguồn bên dưới. Kiểm tra chúng có biên dịch
hay thực thi thành công hay không. Giải thích. Nếu chương trình không có lỗi, tiến
hành chạy từng bước để hiểu rõ thứ tự chạy của các lệnh và kết quả xuất ra.
// 1.
class A {
public:
protected:
int i;
};
class B : public A {
friend void f(A*, B*);
void g(A*);
};
void f(A* pa, B* pb) {
pa->i = 1;
pb->i = 2;
int A::* point_i = &A::i;
int A::* point_i2 = &B::i;
}
void B::g(A* pa) {
pa->i = 1;
i = 2;
int A::* point_i = &A::i;
int A::* point_i2 = &B::i;
}
void h(A* pa, B* pb) {
pa->i = 1;
pb->i = 2;
}
int main() { }
// 2.
struct A {
void f() { }
};
struct B : A {
void f(int) { }
5. tthai/ddkhoa/htthanh@fit.hcmus.edu.vn
Trang 5
};
int main() {
B obj_B;
obj_B.f(3);
obj_B.f();
}
// 3.
struct A {
void f() { }
};
struct B : A {
using A::f;
void f(int) { }
};
int main() {
B obj_B;
obj_B.f(3);
obj_B.f();
}
// 4.
#include <iostream>
using namespace std;
struct A {
void f() { }
void f(int) { cout << "void A::f(int)" << endl; }
};
struct B : A {
using A::f;
void f(int) { cout << "void B::f(int)" << endl; }
};
int main() {
B obj_B;
obj_B.f(3);
}
3. Viết chương trình chứa các đoạn mã nguồn bên dưới. Kiểm tra chúng có biên dịch
hay thực thi thành công hay không. Giải thích. Nếu chương trình không có lỗi, tiến
hành chạy từng bước để hiểu rõ thứ tự chạy của các lệnh và kết quả xuất ra.
// 1.
#include <iostream>
using namespace std;
6. tthai/ddkhoa/htthanh@fit.hcmus.edu.vn
Trang 6
class B1 {
int b;
public:
B1() { cout << "B1::B1()" << endl; };
// inline constructor
B1(int i) : b(i) { cout << "B1::B1(int)" << endl; }
};
class B2 {
int b;
protected:
B2() { cout << "B2::B2()" << endl; }
// noninline constructor
B2(int i);
};
// B2 constructor definition including initialization list
B2::B2(int i) : b(i) { cout << "B2::B2(int)" << endl; }
class D : public B1, public B2 {
int d1, d2;
public:
D(int i, int j) : B1(i+1), B2(), d1(i) {
cout << "D1::D1(int, int)" << endl;
d2 = j;}
};
int main() {
D obj(1, 2);
}
// 2. Sử dụng tiếp tục mã nguồn ở 1.
class D : public B1, public B2 {
int d1, d2;
public:
// call B2() generated by compiler
D(int i, int j) : B1(i+1), d1(i) {
cout << "D1::D1(int, int)" << endl;
d2 = j;}
};
// 3. Sử dụng tiếp tục mã nguồn ở 2.
class B {
B() { }
};
class D : public B {
// error: implicit call to private B() not allowed
D() { }
};
7. tthai/ddkhoa/htthanh@fit.hcmus.edu.vn
Trang 7
// 4.
class A {
public:
A(int) { }
};
class B : public A {
static const int i;
const int j;
int &k;
public:
B(int& arg) : A(0), j(1), k(arg) { }
};
int main() {
int x = 0;
B obj(x);
};
// 5.
#include <iostream>
using namespace std;
struct A {
int i;
A(int arg) : i(arg) {
cout << "Value of i: " << i << endl;
}
};
struct B : A {
int j;
int f() { return i; }
B();
};
B::B() : A(f()), j(1234) {
cout << "Value of j: " << j << endl;
}
int main() {
B obj;
}
// 6.
#include <iostream>
using namespace std;
struct A {
int i;
A(int arg) : i(arg) {
cout << "Value of i: " << i << endl;
}
};
struct B : A {
8. tthai/ddkhoa/htthanh@fit.hcmus.edu.vn
Trang 8
int j;
int f() { return i; }
B();
};
B::B() : A(5678), j(f()) {
cout << "Value of j: " << j << endl;
}
int main() {
B obj;
}
4. Viết chương trình chứa các đoạn mã nguồn bên dưới. Kiểm tra chúng có biên dịch
hay thực thi thành công hay không. Giải thích. Nếu chương trình không có lỗi, tiến
hành chạy từng bước để hiểu rõ thứ tự chạy của các lệnh và kết quả xuất ra.
// 1.
#include <iostream>
using namespace std;
struct V {
V() { cout << "V()" << endl; }
};
struct V2 {
V2() { cout << "V2()" << endl; }
};
struct A {
A() { cout << "A()" << endl; }
};
struct B : virtual V {
B() { cout << "B()" << endl; }
};
struct C : B, virtual V2 {
C() { cout << "C()" << endl; }
};
struct D : C, virtual V {
A obj_A;
D() { cout << "D()" << endl; }
};
int main() {
D c;
}
// 2.
#include <string>
class Y {
private:
char * string;
int number;
public:
// Constructor
Y(const char*, int);
9. tthai/ddkhoa/htthanh@fit.hcmus.edu.vn
Trang 9
// Destructor
~Y() { delete[] string; }
};
// Define class Y constructor
Y::Y(const char* n, int a) {
string = strcpy(new char[strlen(n) + 1 ], n);
number = a;
}
int main () {
// Create and initialize
// object of class Y
Y yobj = Y("somestring", 10);
// ...
// Destructor ~Y is called before
// control returns from main()
}
// 3.
#include <new>
#include <iostream>
using namespace std;
class A {
public:
A() { cout << "A::A()" << endl; }
~A() { cout << "A::~A()" << endl; }
};
int main () {
char* p = new char[sizeof(A)];
A* ap = new (p) A;
ap->A::~A();
delete [] p;
}
3 Bài tập về nhà
1. Viết chương trình chứa các đoạn mã nguồn bên dưới. Kiểm tra chúng có biên dịch
hay thực thi thành công hay không. Giải thích. Nếu chương trình không có lỗi, tiến
hành chạy từng bước để hiểu rõ thứ tự chạy của các lệnh và kết quả xuất ra.
// 1.
#include <iostream>
using namespace std;
class A
{
public:
A(int nValue)
{
cout << "A: " << nValue << endl;
10. tthai/ddkhoa/htthanh@fit.hcmus.edu.vn
Trang 10
}
};
class B: public A
{
public:
B(int nValue, double dValue)
: A(nValue)
{
cout << "B: " << dValue << endl;
}
};
class C: public B
{
public:
C(int nValue, double dValue, char chValue)
: B(nValue, dValue)
{
cout << "C: " << chValue << endl;
}
};
int main()
{
C cClass(5, 4.3, 'R');
return 0;
}
// 2.
#include <iostream>
using namespace std;
struct E {
const char* message;
E() : message("Class E") { }
};
struct E1 : E {
const char* message;
E1() : message("Class E1") { }
};
struct E2 : E {
const char* message;
E2() : message("Class E2") { }
};
void f() {
try {
cout << "In try block of f()" << endl;
cout << "Throwing exception of type E1" << endl;
E1 myException;
throw myException;
}