text:
Hotline: 091.352.8198
Là người chỉ huy Cứu quốc quân bảo vệ căn cứ địa cách mạng, Thượng tướng Chu Văn Tấn được mệnh danh là “Hùm xám Bắc Sơn”./ Vị tướng tuổi 30
Người anh cả du kích Việt Nam
Ngày 1/1/1967, tại Phủ Chủ tịch, Chủ tịch Hồ Chí Minh đã tiếp các Anh hùng và đại biểu của các đơn vị anh hùng vừa được tuyên dương.
Cùng tham dự cuộc đón tiếp này, có mặt Thượng tướng Chu Văn Tấn, Phó Chủ tịch Ủy ban Thường vụ Quốc hội. Phóng viên Đài Tiếng nói Việt Nam, nhà báo Lê Tiến tham dự cuộc gặp mặt hôm đó đã ghi lại: “Chu Văn Tấn, người anh cả của lực lượng du kích quân Việt Nam”.
Bài ghi chép này với nhan đề “Năm mới các anh hùng đến “xông nhà” Bác Hồ” hiện đang được bảo quản tại Bảo tàng Hồ Chí Minh (Ký hiệu: H25C15/45).
Xuất thân trong một gia đình thổ hào người Nùng yêu nước, thuộc tổng Lâu Thượng, châu Võ Nhai, tỉnh Lạng Sơn (nay là xã Phú Thượng, huyện Võ Nhai, tỉnh Thái Nguyên), cụ thân sinh ra ông là Chu Văn Hòa đã tham gia nghĩa quân Hoàng Hoa Thám chống Pháp nhiều năm.
Khi biết Chu Văn Tấn hoạt động đánh Tây, cụ đồng tình tạo mọi điều kiện cho con đi công tác. Mãi năm 1944, khi thực dân Pháp cho quân bao vây, càn quét căn cứ Bắc Sơn, cụ nói với con: “16 tuổi tao đã cầm cái súng chống thằng Tây, ở đội quân của cụ Đề Thám. Giờ tao già không làm được thì chúng mày làm đi...”.
Chu Văn Tấn tham gia quân sự từ Chỉ huy phó đội du kích Bắc Sơn gồm 32 chiến sĩ, do đồng chí Lương Văn Tri (bí danh Huy Còm) làm Chỉ huy trưởng. Sau khởi nghĩa Bắc Sơn, hai đồng chí Phùng Chí Kiên và Lương Văn Tri bị phục kích hy sinh, tiểu đội do ông chỉ huy thoát khỏi vòng vây về được Pác Pó. Từ đây, đội chuyển thành đơn vị vũ trang bảo vệ căn cứ.
Một thời gian sau, nhận chỉ thị của Trung ương Đảng, Chu Văn Tấn về lại Võ Nhai để xây dựng và làm Chỉ huy trưởng của Trung đội Cứu quốc quân thứ hai, với 47 chiến sĩ. Song song với Đội Việt Nam tuyên truyền giải phóng quân do đồng chí Võ Nguyên Giáp chỉ huy, Cứu quốc quân nhanh chóng phát triển lực lượng, xây dựng Chiến khu Nguyễn Huệ.
Tại Hội nghị Quân sự Bắc Kỳ (5/1945), Việt Nam tuyên truyền giải phóng quân và Cứu quốc quân hợp nhất thành Việt Nam giải phóng quân.
Tháng 8/1945, trong Chính phủ lâm thời, ông Chu Văn Tấn được cử làm Bộ trưởng Bộ Quốc phòng. Ông là vị Bộ trưởng Bộ Quốc phòng đầu tiên của nước ta. Năm 1948, ông là 1 trong 9 vị Thiếu tướng đầu tiên. Mười năm sau, năm 1958, Chu Văn Tấn cùng Văn Tiến Dũng là hai Thượng tướng đầu tiên, được phong vượt cấp từ Thiếu tướng lên.
Hùm xám Bắc Sơn
Có một điều ít ai biết rằng, người Pháp luôn đặt câu hỏi về vị tướng mang biệt danh “Hùm xám Bắc Sơn” đã từng khiến họ mất ăn mất ngủ.
Năm 1967-1968, đạo diễn người Pháp, ông Gérald Guillaume, sang Việt Nam làm bộ phim tài liệu “Hồ Chí Minh - chân dung một lãnh tụ”. Viết xong kịch bản và quay xong những thước phim nhựa tư liệu về Hồ Chí Minh, ông Gérald Guillaume đề đạt nguyện vọng muốn dựng thêm bộ phim về một nhân vật lãnh đạo khác nhưng phải “rất Việt Nam”. Nghe xong, Hồ Chủ tịch vui vẻ nói: “Đồng chí Vũ Kỳ sẽ lo thủ tục đưa đoàn lên Việt Bắc, làm phim về “Hùm xám Bắc Sơn”!
Đạo diễn Gérald Guillaume lên Thái Nguyên, vào Bộ Tư lệnh Quân khu Việt Bắc. Đoàn làm phim được Thượng tướng Chu Văn Tấn tiếp đón thịnh tình. Sau đó đích thân ông đưa đoàn về phỏng vấn và thực hiện quay tại Phú Thượng quê hương ông, rồi dẫn đi lấy tư liệu ở các địa danh lịch sử mà Đội Du kích Bắc Sơn, Trung đội Cứu Quốc quân từng chiến đấu.
Trở về Hà Nội, đạo diễn Gérald Guillaume tâm sự: “Ông Chu Văn Tấn là một con người vĩ đại theo đúng nghĩa của từ này!’.
Thượng tướng Chu Văn Tấn (1910-1984)
Bộ phim “Hùm xám Bắc Sơn” được chiếu rộng rãi tại các trung tâm huấn luyện quân sự và các trường quân sự tại Pháp, đã khiến các tướng lĩnh Pháp ngỡ ngàng trước đối thủ của họ từ gần 30 năm trước.
Nguồn động viên của các dân tộc
Thượng tướng Chu Văn Tấn được giao nhiệm vụ Trưởng ban Dân tộc của Đảng, Chủ tịch Hội đồng Dân tộc của Quốc hội, Chủ nhiệm Ủy ban Dân tộc của Chính phủ khi những tổ chức này mới được thành lập.
Phân tích về vấn đề dân tộc, ông đã chỉ rõ trên đất nước Việt Nam ta, đoàn kết là một truyền thống quý báu, Đảng ta đã phát huy truyền thống đó, đoàn kết các dân tộc, bảo vệ Tổ quốc, từng bước cải thiện đời sống nhân dân.
Ông Nguyễn Tâm, thư ký của Thượng tướng Chu Văn Tấn kể rằng, là người lãnh đạo cao cấp của Đảng và Nhà nước, người tiêu biểu của các dân tộc thiểu số, ông có nếp sống gần trên gần dưới.
Ông dễ gần đối với cán bộ, chiến sĩ và mọi người có thái độ vui vẻ, bình đẳng và tự nhiên. Bà con dân bản cho rằng, Thượng tướng Chu Văn Tấn là nguồn động viên của các dân tộc thiểu số, không chỉ người Nùng cùng dân tộc với ông, mà người Tày, người Dao, người Mông, người Cao Lan, người Sán Chí... đều nói vậy.
Năm 2010, tại kỷ niệm 100 năm ngày sinh Thượng tướng Chu Văn Tấn, tổ chức tại Hà Nội, PGS.NGND Lê Mậu Hãn đã đánh giá: “Đặc biệt kiên trì mục tiêu lý tưởng cách mạng là động lực để Chu Văn Tấn không ngừng vươn lên và thực hiện các trọng trách do Đảng và Nhà nước giao phó trong vòng bốn thập kỷ dưới ngọn cờ độc lập tự do của Hồ Chí Minh đã được nhân dân tin yêu, được Đảng và Nhà nước ghi nhận bằng việc trao tặng các huân chương cao quý...”.
Mới đây nhất, ngày 16/12/2014, Chủ tịch Ủy ban Trung ương MTTQ Việt Nam Nguyễn Thiện Nhân đã đến thắp hương tưởng niệm Thượng tướng Chu Văn Tấn tại nhà riêng.


text:
- Thiết bị kiểm kho Honeywell (Metrologic)
- Model: OptimusS – MK5535
- Hãng sản xuất: Metrologic (Honeywell)
- Xuất xứ: Đài Loan
- Bộ nhớ: 3MB
- Tốc độ đọc (lần/giây): 100, Laser, đơn tia
- Khoảng cách đọc tối đa: 222mm
- Giao tiếp: RS232 + Bluetooth
- Khả năng chịu va đập: Rơi từ độ cao 1.2m
- Trọng lượng: 140g
Từ khóa tìm
Giá sản phẩmTìm kiếm

markdown:
|Giá bán:||Hết hàng|
|Tình trạng:||Mới 100%|
|Bảo hành:||12 tháng|
|Xuất xứ:|
|
|![]()
|
|
Mã SP
|
|
OptimusS - MK5535
|
|
Hãng
|
|
Metrologic (Honeywell)
|
|
Xuất xứ
|
|
Đài Loan
|
|
Giá:
|
|
LienHe
|
|
VAT
|
|
10
|
|
Bảo hành
|
|
12 Tháng
- Thiết bị kiểm kho Honeywell (Metrologic)
- Model: OptimusS – MK5535
- Hãng sản xuất: Metrologic (Honeywell)
- Xuất xứ: Đài Loan
- Bộ nhớ: 3MB
- Tốc độ đọc (lần/giây): 100, Laser, đơn tia
- Khoảng cách đọc tối đa: 222mm
- Giao tiếp: RS232 + Bluetooth
- Khả năng chịu va đập: Rơi từ độ cao 1.2m
- Trọng lượng: 140g
Từ khóa tìm
Giá sản phẩm

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Identified-Payload-Type: application/xhtml+xml

Connection: close

Cache-Control: private

Content-Type: text/html; charset=utf-8


text:
Cách đây mấy năm, Hoàng Thị Thiêm ở xã Hòa Sơn (Lương Sơn, Hòa Bình) nổi tiếng với khả năng nhìn mọi vật khi đã bịt hai mắt lại.
Người ta gọi Hoàng Thị Thiêm là người đàn bà ba mắt. Tuy nhiên, gần đây, nhiều người lại quen gọi người đàn bà này với tên “cô” Thiêm bởi họ tin “cô” có khả năng áp vong, gọi hồn…
Nơi “cô” Thiêm hành nghề nằm trên một khu đồi mà nhiều người gọi đó là khu đồi ma bởi trong nhà lúc nào cũng khói hương nghi ngút hòa cùng tiếng cô Thiêm nói chuyện, dạy bảo, có khi là dọa nạt các… linh hồn.
Trên khuôn viên vài trăm mét vuông, cô Thiêm dựng một căn nhà nhỏ, một điện thờ còn phần lớn là chỗ để hàng trăm con người đến gọi hồn ngồi lại chờ cô Thiêm giúp họ gọi những linh hồn đã khuất về hỏi chuyện. Dù đã tới nhà “cô” Thiêm nhiều lần nhưng lần nào đến, tôi cũng thấy bất ngờ bởi những gì đang diễn ra mà cô Thiêm là nhân vật chính.
Cô Thiêm “cưới vợ” cho “vong” người Trung Quốc
Lần này, tôi được chứng kiến từ đầu đến cuối cuộc gọi cùng một lúc hai hồn cho hai cô gái. Cả hai cô gái này tuổi mới ngoài đôi mươi, theo người nhà nói thì họ có biểu hiện tâm thần nhưng chữa trị nhiều cách không khỏi nên đành đến nhờ cô Thiêm.
Sau khi nghe gia đình hai cô gái trình bày, cô Thiêm hướng dẫn họ ngồi im nhập tâm để cô Thiêm “bắt sóng” với người âm mời họ về. 10 phút sau, cả hai cô gái lần lượt ngả nghiêng người, một cô gái bỗng nằm vật ra nền nhà,mê man bất tỉnh (?). Cô còn lại vẫn lim dim mắt, lắc lư. Cô Thiêm tuyên bố: Vong đã nhập!
Sau “khoảnh khắc” trên, “cô” Thiêm chạy như con thoi giữa hai bên để hỏi chuyện lí lịch trích ngang của các vong. Trường hợp của cô gái ngồi lắc lư, cô Thiêm nhanh chóng hỏi ra thân thế của oan hồn là một người đàn ông chết khi chưa có vợ (?).
Sau khi hỏi xong, cô Thiêm ngọt xớt với vong: “Nào, bây giờ đằng ấy về cõi âm rồi thì đừng theo em gái này nữa. Quý em ấy thì phù hộ cho em được sống yên ổn nhé!” Trước lời đường mật trên, cô gái chỉ lắc đầu mà không nói gì. Cô Thiêm vội quay ra nói với người nhà của cô gái: “Muốn vong không đi theo nữa thì chỉ còn cách cưới vợ cho vong”.
Trước lời phán của cô Thiêm, gia đình cô gái vội quây lại hỏi cô: Thế làm cách nào thì cô giúp cháu.” Trầm ngâm, cô Thiêm bày: “Bây giờ, gia đình bỏ tiền ra để tôi đặt một hình nhân có kích thước giống con gái các bác rồi làm lễ để hồn nhận hình nhân đó làm vợ. Chỉ cần như vậy là vong sẽ không còn theo con gái các bác nữa.”
Như người chết đuối vớ được cọc, gia đình cô gái đồng ý với mọi sự sắp xếp của cô Thiêm. Một thành viên trong gia đình cho biết: “Chi phí cho hình nhân trên là khoảng 2 triệu đồng. Kích thước hình nhân không được sai một li vì như vậy vong sẽ không nhận.” Tuy nhiên, để có được kích thước không được phép sai lệch đó, cô Thiêm đã dùng tay để đo. Sắp xếp xong mọi chuyện, cô Thiêm quay ra thủ thỉ với vong: “Bây giờ thì ngồi đợi thầy nhé! Lát nữa, thầy sẽ cưới vợ cho. Thích nhé! Sắp có vợ đẹp”.
Sau khi dỗ dành xong vong kia, cô Thiêm quay sang cô gái đang nằm miên man trên nền nhà. Vẫn với cách dỗ ngon, dỗ ngọt để hỏi lai lịch của vong nhưng dường như lần này, cô Thiêm gặp phải vong… cứng đầu, không chịu khai báo bất kì một thông tin gì. Tức khí, cô Thiêm quay ra dọa: “Thầy nói cho mà biết nhé! Lúc hiền thì thầy hiền thật nhưng thầy mà tức lên thì thầy cũng không phải vừa đâu.”
Cô gái vẫn lắc đầu im lặng. Không còn cách nào khác, cô Thiêm bèn dùng tay tát liên tiếp vào mặt cô gái. Lúc này, cô gái được cho là vong nhập hai tay xua xua về phía trước rồi liên tục nói một câu duy nhất: “Bua, bua, bua bua.” Lúc này, cô Thiêm quay ra kết luận một câu: “Đây là oan hồn người Trung Quốc. Chắc mê con bé nhà các bác nên theo đòi cưới đây”.
Tiền ít, vong không về
Để xem thực chất việc gọi hồn của người đàn bà ba mắt, tôi đã xin đăng kí gọi hồn. Hỏi thủ tục đăng kí, người ta chỉ sang quán bên cạnh mua một bộ lễ rồi ra gặp một người đàn ông là chồng cô Thiêm. Tại chiếc bàn người đàn ông này ngồi là một túi bóng cứng (loại đựng tài liệu) bên trong đầy những đồng tiền với các mệnh giá 50 nghìn đồng, 200 nghìn đồng và thậm chí là 500 nghìn đồng do người đến gọi hồn đặt lễ. Tôi đăng kí, đặt lễ 50 ngàn đồng kèm theo lễ. Được ông chồng phát cho một tờ giấy, nói ghi rõ họ tên người gọi, họ tên vong được gọi rồi đặt kèm vào lễ. Mâm lễ của tôi được đặt cạnh nhiều mâm lễ khác với số tiền đặt lễ lên tới vài trăm, thậm chí là cả triệu.
Sau khi đặt lễ, tôi ngồi vào một góc như bao người khác để “đợi vong về”. Một tiếng, rồi hai tiếng qua đi, tôi vẫn ngồi im bất động. Trời xế chiều, khi đoàn người lần lượt ra về, tôi vẫn ngồi im mà không một lần được cô Thiêm hỏi thăm. Trong khi, với các gia đình khác, cô Thiêm luôn vồn vã hỏi thăm và có nhà còn được cô trực tiếp gọi hồn. Tôi ra về khi trời đã nhập nhoạng tối.
Cô Quyết – một người dân xã Hòa Sơn – bán hàng gần khu vực UBND xã cho biết: “Thực ra, số người đến nhờ cô Thiêm gọi hồn chủ yếu là ở các tỉnh xa về chứ dân trong vùng thì họ không đi. Nhà tôi, năm ngoái có nhờ cô ấy gọi vong hộ một lần nhưng thấy không đúng nên từ đó tôi không bao giờ đến để nhờ cô Thiêm gọi hồn”.
Khi được hỏi về quan điểm của chính quyền xã Hòa Sơn về hoạt động gọi hồn của cô Thiêm, ông Nguyễn Văn Cành, Chủ tịch UBND xã khẳng định: “Chúng tôi không ủng hộ những hoạt động mê tín, gọi hồn chỗ cô Thiêm và sẽ cho lực lượng công an, an ninh giám sát chặt chẽ. Sắp tới, chúng tôi sẽ báo cáo lên cấp trên về trường hợp này để sớm dẹp bỏ những hoạt động mê tín dị đoan tại khu vực trên”.
Theo Tuổi Trẻ Thủ Đô
Nguồn: VTC.vn
Không có nhận xét nào:
Đăng nhận xét

markdown:
Người ta gọi Hoàng Thị Thiêm là người đàn bà ba mắt. Tuy nhiên, gần đây, nhiều người lại quen gọi người đàn bà này với tên “cô” Thiêm bởi họ tin “cô” có khả năng áp vong, gọi hồn…
Nơi “cô” Thiêm hành nghề nằm trên một khu đồi mà nhiều người gọi đó là khu đồi ma bởi trong nhà lúc nào cũng khói hương nghi ngút hòa cùng tiếng cô Thiêm nói chuyện, dạy bảo, có khi là dọa nạt các… linh hồn.
Trên khuôn viên vài trăm mét vuông, cô Thiêm dựng một căn nhà nhỏ, một điện thờ còn phần lớn là chỗ để hàng trăm con người đến gọi hồn ngồi lại chờ cô Thiêm giúp họ gọi những linh hồn đã khuất về hỏi chuyện. Dù đã tới nhà “cô” Thiêm nhiều lần nhưng lần nào đến, tôi cũng thấy bất ngờ bởi những gì đang diễn ra mà cô Thiêm là nhân vật chính.
**Cô Thiêm “cưới vợ” cho “vong” người Trung Quốc**
Lần này, tôi được chứng kiến từ đầu đến cuối cuộc gọi cùng một lúc hai hồn cho hai cô gái. Cả hai cô gái này tuổi mới ngoài đôi mươi, theo người nhà nói thì họ có biểu hiện tâm thần nhưng chữa trị nhiều cách không khỏi nên đành đến nhờ cô Thiêm.
Sau khi nghe gia đình hai cô gái trình bày, cô Thiêm hướng dẫn họ ngồi im nhập tâm để cô Thiêm “bắt sóng” với người âm mời họ về. 10 phút sau, cả hai cô gái lần lượt ngả nghiêng người, một cô gái bỗng nằm vật ra nền nhà,mê man bất tỉnh (?). Cô còn lại vẫn lim dim mắt, lắc lư. Cô Thiêm tuyên bố: Vong đã nhập!
Sau “khoảnh khắc” trên, “cô” Thiêm chạy như con thoi giữa hai bên để hỏi chuyện lí lịch trích ngang của các vong. Trường hợp của cô gái ngồi lắc lư, cô Thiêm nhanh chóng hỏi ra thân thế của oan hồn là một người đàn ông chết khi chưa có vợ (?).
Sau khi hỏi xong, cô Thiêm ngọt xớt với vong: “Nào, bây giờ đằng ấy về cõi âm rồi thì đừng theo em gái này nữa. Quý em ấy thì phù hộ cho em được sống yên ổn nhé!” Trước lời đường mật trên, cô gái chỉ lắc đầu mà không nói gì. Cô Thiêm vội quay ra nói với người nhà của cô gái: “Muốn vong không đi theo nữa thì chỉ còn cách cưới vợ cho vong”.
Trước lời phán của cô Thiêm, gia đình cô gái vội quây lại hỏi cô: Thế làm cách nào thì cô giúp cháu.” Trầm ngâm, cô Thiêm bày: “Bây giờ, gia đình bỏ tiền ra để tôi đặt một hình nhân có kích thước giống con gái các bác rồi làm lễ để hồn nhận hình nhân đó làm vợ. Chỉ cần như vậy là vong sẽ không còn theo con gái các bác nữa.”
Như người chết đuối vớ được cọc, gia đình cô gái đồng ý với mọi sự sắp xếp của cô Thiêm. Một thành viên trong gia đình cho biết: “Chi phí cho hình nhân trên là khoảng 2 triệu đồng. Kích thước hình nhân không được sai một li vì như vậy vong sẽ không nhận.” Tuy nhiên, để có được kích thước không được phép sai lệch đó, cô Thiêm đã dùng tay để đo. Sắp xếp xong mọi chuyện, cô Thiêm quay ra thủ thỉ với vong: “Bây giờ thì ngồi đợi thầy nhé! Lát nữa, thầy sẽ cưới vợ cho. Thích nhé! Sắp có vợ đẹp”.
Sau khi dỗ dành xong vong kia, cô Thiêm quay sang cô gái đang nằm miên man trên nền nhà. Vẫn với cách dỗ ngon, dỗ ngọt để hỏi lai lịch của vong nhưng dường như lần này, cô Thiêm gặp phải vong… cứng đầu, không chịu khai báo bất kì một thông tin gì. Tức khí, cô Thiêm quay ra dọa: “Thầy nói cho mà biết nhé! Lúc hiền thì thầy hiền thật nhưng thầy mà tức lên thì thầy cũng không phải vừa đâu.”
Cô gái vẫn lắc đầu im lặng. Không còn cách nào khác, cô Thiêm bèn dùng tay tát liên tiếp vào mặt cô gái. Lúc này, cô gái được cho là vong nhập hai tay xua xua về phía trước rồi liên tục nói một câu duy nhất: “Bua, bua, bua bua.” Lúc này, cô Thiêm quay ra kết luận một câu: “Đây là oan hồn người Trung Quốc. Chắc mê con bé nhà các bác nên theo đòi cưới đây”.
**Tiền ít, vong không về**
Để xem thực chất việc gọi hồn của người đàn bà ba mắt, tôi đã xin đăng kí gọi hồn. Hỏi thủ tục đăng kí, người ta chỉ sang quán bên cạnh mua một bộ lễ rồi ra gặp một người đàn ông là chồng cô Thiêm. Tại chiếc bàn người đàn ông này ngồi là một túi bóng cứng (loại đựng tài liệu) bên trong đầy những đồng tiền với các mệnh giá 50 nghìn đồng, 200 nghìn đồng và thậm chí là 500 nghìn đồng do người đến gọi hồn đặt lễ. Tôi đăng kí, đặt lễ 50 ngàn đồng kèm theo lễ. Được ông chồng phát cho một tờ giấy, nói ghi rõ họ tên người gọi, họ tên vong được gọi rồi đặt kèm vào lễ. Mâm lễ của tôi được đặt cạnh nhiều mâm lễ khác với số tiền đặt lễ lên tới vài trăm, thậm chí là cả triệu.
Sau khi đặt lễ, tôi ngồi vào một góc như bao người khác để “đợi vong về”. Một tiếng, rồi hai tiếng qua đi, tôi vẫn ngồi im bất động. Trời xế chiều, khi đoàn người lần lượt ra về, tôi vẫn ngồi im mà không một lần được cô Thiêm hỏi thăm. Trong khi, với các gia đình khác, cô Thiêm luôn vồn vã hỏi thăm và có nhà còn được cô trực tiếp gọi hồn. Tôi ra về khi trời đã nhập nhoạng tối.
Cô Quyết – một người dân xã Hòa Sơn – bán hàng gần khu vực UBND xã cho biết: “Thực ra, số người đến nhờ cô Thiêm gọi hồn chủ yếu là ở các tỉnh xa về chứ dân trong vùng thì họ không đi. Nhà tôi, năm ngoái có nhờ cô ấy gọi vong hộ một lần nhưng thấy không đúng nên từ đó tôi không bao giờ đến để nhờ cô Thiêm gọi hồn”.
Khi được hỏi về quan điểm của chính quyền xã Hòa Sơn về hoạt động gọi hồn của cô Thiêm, ông Nguyễn Văn Cành, Chủ tịch UBND xã khẳng định: “Chúng tôi không ủng hộ những hoạt động mê tín, gọi hồn chỗ cô Thiêm và sẽ cho lực lượng công an, an ninh giám sát chặt chẽ. Sắp tới, chúng tôi sẽ báo cáo lên cấp trên về trường hợp này để sớm dẹp bỏ những hoạt động mê tín dị đoan tại khu vực trên”.
**Theo Tuổi Trẻ Thủ Đô** **Nguồn:**
## Không có nhận xét nào:
## Đăng nhận xét

WARC-Identified-Payload-Type: text/html

Server: GSE

X-Content-Type-Options: nosniff

Cache-Control: private, max-age=0

X-XSS-Protection: 1; mode=block

Content-Type: text/html; charset=UTF-8


text:
Giới Thiệu:
Phim Mặt Nạ Công Tố Viên - Trọn bộ
Mặt Nạ Công Tố Viên.Ha Dae-chul là một công tố viên người thường thất vọng với những sơ hở trong hệ thống tư pháp cho phép bọn tội phạm không bị trừng phạt. Điều này khiến hắn phải đeo mặt nạ vào ban đêm và trở thành một cảnh vệ. Yoo Min-hee là một thám tử trong các đơn vị tội phạm bạo lực, và cô cũng không kém phần đam mê theo đuổi công lý.

markdown:
Giới Thiệu:
### Phim
[Mặt Nạ Công Tố Viên](http://phim1vui.net/phim/mat-na-cong-to-vien) - Trọn bộ
Mặt Nạ Công Tố Viên.Ha Dae-chul là một công tố viên người thường thất vọng với những sơ hở trong hệ thống tư pháp cho phép bọn tội phạm không bị trừng phạt. Điều này khiến hắn phải đeo mặt nạ vào ban đêm và trở thành một cảnh vệ. Yoo Min-hee là một thám tử trong các đơn vị tội phạm bạo lực, và cô cũng không kém phần đam mê theo đuổi công lý.

WARC-Truncated: length

Server: cloudflare-nginx

Pragma: no-cache

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0


text:
- Đăng tin ưu tiên
-
Các dịch vụ ưu tiên trên Rồng Bay
-
Ưu đãi cho khách hàng thường xuyên
Sử dụng tài khoản chuyên nghiệp
-
Ðăng tin thu hút khách hàng
Cách viết tiêu đề thân thiện, lôi cuốn khách hàng
-
- Hỏi & đáp
- Hỗ trợ
- Mua quảng cáo
- Đăng ký
- Đăng nhập

markdown:
- Đăng tin ưu tiên
-
__Các dịch vụ ưu tiên trên Rồng Bay__
-
__Ưu đãi cho khách hàng thường xuyên__ [Sử dụng tài khoản chuyên nghiệp](http://rongbay.com/su-dung-tai-khoan-chuyen-nghiep.html)
-
__Ðăng tin thu hút khách hàng__ [Cách viết tiêu đề thân thiện, lôi cuốn khách hàng](http://rongbay.com/Cach-viet-tieu-de-than-thien-loi-cuon-khach-hang-fp39.html)
-
[Hỏi & đáp](http://rongbay.com/faqs.html)
- Hỗ trợ
- Nếu bạn cần hỗ trợ, vui lòng liên hệ
-
Điện thoại : **(024) 73095555**(ext: 497 / 496 / 495) Hotline : **0936 194 226**(Nội dung, tin đăng) **0932 223 656**(Liên hệ quảng cáo) : [lienhe@rongbay.com](mailto:lienhe@rongbay.com) Skype : [cskh.rongbay](skype:cskh.rongbay?chat)
-
[Mua quảng cáo](http://rongbay.com/mua-quang-cao.html) [Đăng ký](javascript:void(0);) [Đăng nhập](javascript:void(0);)

Server: Zamba VCCorp

Set-Cookie: cityOtherRBName=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=.rongbay.com


Set-Cookie: cityOtherRBName=Quang-Binh; expires=Tue, 24-Jul-2018 03:00:34 GMT; Max-Age=31535999; path=/; domain=.rongbay.com


text:
Sàn nhạc sử dụng tốt nhất ở trình duyệt Firefox
Để thu âm và sử dụng sannhac một cách dễ dàng, bạn hãy cài đặt phầm mềm sau
Bắt đầu cài đặt Firefox
để duyệt web nhanh hơn
Đăng nhập
|
Đăng ký
Tên đăng nhập
Mật khẩu
Ghi nhớ
Quên mật khẩu
|
Gửi lại mail kích hoạt
Trang chủ
Phòng thu
Sàn đấu
Club
Hát Live
Sàn Nhạc
Sàn Diễn
1 waitfor delay '0:0:26.576999
Trả lời
SanNhac.com
on Facebook
Bình luận & Đánh giá
Bạn có thể đăng nhập bằng tài khoản
Yahoo
hoặc
Google
để bình luận hoặc đánh giá cho bài hát này
Hoặc đăng ký tài khoản mới
tại đây
Hủy
Bình luận
Chia sẻ ca khúc
Tặng quà
Cắt nhạc chuông
Bình luận
Chia sẻ ca khúc
Tặng quà
Cắt nhạc chuông
Bạn muốn chia sẻ ca khúc này cho thành viên
Mô tả
Bạn phải
đăng nhập
mới được chia sẻ ca khúc!
Bình luận
Chia sẻ ca khúc
Tặng quà
Cắt nhạc chuông
Bạn muốn tặng ca khúc này cho thành viên
Gửi quà và tin nhắn
Bình luận
Chia sẻ ca khúc
Tặng quà
Tạo nhạc chuông
Để tạo nhạc chuông theo phong cách riêng của bạn, hãy thực hiện các bước sau :
Bước 1 :
Chọn đoạn nhạc chuông bạn muốn cắt (đoạn được bôi trắng).
Bước 2 :
Thay đổi độ dài đoạn nhạc mà bạn muốn làm nhạc chuông bằng cách di chuyển hai đầu đoạn trắng, click
play
để nghe thử.
Bước 3 :
Nếu bạn đã ưng ý, hãy nhấn nút
Mp3
hoặc
ARM
chọn định dạng và
nhắn tin theo hướng dẫn
để tải nhạc chuông về máy hoặc tặng bạn bè.
Xem toàn bộ
Di chuyển
Đóng
Di chuyển
Đóng
Viết lưu bút cho
Nhắn tin cho
Tiêu đề
Nội dung tin nhắn
Thông tin chi tiết
Chuột yêu gạo - Hương Hương
Thể hiện:
lucycute
0 vote sao - 231 lượt nghe
Thời gian: 24/12/2007 21:23:05
Thêm vào playlist của bạn
Thêm vào danh sách yêu thích
Mã Nhúng Blog
Mã Nhúng Forum
Đã Copy
Mới nhất của lucycute
Hay nhất của lucycute
Cùng thể hiện bài này
Sàn Nhạc
, Tầng 21 Tòa nhà Center Building - Hapulico Complex
Số 1 Nguyễn Huy Tưởng, Thanh Xuân, Hà Nội.
Email:
sannhac@gmail.com
Liên hệ hợp tác: 094.686.1289
Giới thiệu quảng cáo
Liên hệ quảng cáo:
Admicro
Hà Nội – Ms. Hải Yến: 0988 965 517 – (84 4) 3974 8899. Ext 2201
Hồ Chí Minh – Mr.Tuấn: 0983 050 185 – (84 8) 7307 7979. Ext 173
Email:
giaitrixahoi@admicro.vn
Hỗ trợ & CSKH:
Admicro
Ms.Thơm: 01268 269 779
Address: Tầng 20, Center Building Hapulico Complex, Số 1 Nguyễn Huy Tưởng, Thanh Xuân, Hà Nội
Copyright 2009
– Công ty cổ phần VCCorp.
Chịu trách nhiệm quản lý nội dung : Bà Nguyễn Bích Minh.
Tầng 17, 19, 20, 21 Tòa nhà Center Building - Hapulico Complex
Số 1 Nguyễn Huy Tưởng, Thanh Xuân, Hà Nội.
Giấy phép số 280/GP-BTTTT Bộ Thông tin và Truyền thông cấp ngày 14 tháng 06 năm 2017.
Trang chủ
|
Điều khoản
|
Quy định
|
Phòng thu
|
Beat
|
Recording

Server: Apache

Set-Cookie: viewbeat=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0


text:
Diễn đàn chính thức sinh viên Học viện Ngân Hàng
Trang chủ
Thành viên
>
bupbemauhong
>
Hoạt động cuối:
17/10/11
Tham gia ngày:
17/10/11
Bài viết:
0
Đã được thích:
0
Điểm thành tích:
0
bupbemauhong
New Member
bupbemauhong được nhìn thấy lần cuối:
17/10/11
Tin nhắn hồ sơ
Các bài đăng
Thông tin
Hiện tại không có tin nhắn trong hồ sơ của bupbemauhong.
Show Ignored Content
Đang tải...
Xem
Tương tác
Nội dung:
Tìm tất cả nội dung bởi bupbemauhong
Tìm tất cả chủ đề bởi bupbemauhong
Đăng nhập bằng Facebook
Đăng nhập bằng Google
Tên tài khoản hoặc địa chỉ Email:
Bạn đã có tài khoản rồi?
Tích vào đây để đăng ký
Vâng, Mật khẩu của tôi là:
Bạn đã quên mật khẩu?
Duy trì đăng nhập
Diễn đàn chính thức sinh viên Học viện Ngân Hàng
Trang chủ
Thành viên
>
bupbemauhong
>
Trang chủ
Diễn đàn
Video
Video
Liên kết nhanh
Video ngẫu nhiên
Video
Playlists
Diễn đàn học tập
ĐĂNG NHẬP | ĐĂNG KÝ
Diễn đàn
Liên kết nhanh
Tìm kiếm diễn đàn
Watched Tags
Bài viết gần đây
Menu

Server: nginx

Vary: Accept-Encoding

X-Frame-Options: SAMEORIGIN

Vietnix-Cache: HIT from backend


text:
- Hoạt động cuối:
- 25/11/11
- Tham gia ngày:
- 25/11/11
- Bài viết:
- 0
- Đã được thích:
- 0
- Điểm thành tích:
- 0
- Sinh nhật:
- 18/2/84 (Tuổi: 33)
- Nơi ở:
- 1userfield[field2_set]=1
- Nghề nghiệp:
- 1userfield[field4_set]=1
huongduongnga
New Member, 33, đến từ 1userfield[field2_set]=1
- huongduongnga được nhìn thấy lần cuối:
- 25/11/11
-
- Đang tải...
-
Giới thiệu
- Sinh nhật:
- 18/2/84 (Tuổi: 33)
- Nơi ở:
- 1userfield[field2_set]=1
1userfield[field1_set]=1
- Nghề nghiệp:
- 1userfield[field4_set]=1
Tương tác

markdown:
![ huongduongnga](http://svnhforum.com/forum/styles/banh/xenforo/avatars/avatar_l.png)
- Hoạt động cuối:
- 25/11/11
- Tham gia ngày:
- 25/11/11
- Bài viết:
- 0
- Đã được thích:
- 0
- Điểm thành tích:
[0](members/huongduongnga.15316/trophies)
- Sinh nhật:
- 18/2/84 (Tuổi: 33)
- Nơi ở:
[1userfield[field2_set]=1](misc/location-info?location=1userfield%5Bfield2_set%5D%3D1)
- Nghề nghiệp:
- 1userfield[field4_set]=1
# huongduongnga
New Member, 33, đến từ
[1userfield[field2_set]=1](misc/location-info?location=1userfield%5Bfield2_set%5D%3D1)
- huongduongnga được nhìn thấy lần cuối:
- 25/11/11
-
- Đang tải...
-
### Giới thiệu
- Sinh nhật:
- 18/2/84 (Tuổi: 33)
- Nơi ở:
[1userfield[field2_set]=1](misc/location-info?location=1userfield%5Bfield2_set%5D%3D1)
1userfield[field1_set]=1
- Nghề nghiệp:
- 1userfield[field4_set]=1
### Tương tác


text:
- Hoạt động cuối:
- 15/3/13
- Tham gia ngày:
- 15/3/13
- Bài viết:
- 0
- Đã được thích:
- 0
- Điểm thành tích:
- 0
- Nơi ở:
- Barbados
- Nghề nghiệp:
- Mozambique
Jin1d
New Member, đến từ Barbados
- Jin1d được nhìn thấy lần cuối:
- 15/3/13
-
- Đang tải...
-
Giới thiệu
- Nơi ở:
- Barbados
Man
- Nghề nghiệp:
- Mozambique
Tương tác
- ICQ:
- 372897dgf39

markdown:
![ Jin1d](http://svnhforum.com/forum/styles/banh/xenforo/avatars/avatar_l.png)
- Hoạt động cuối:
- 15/3/13
- Tham gia ngày:
- 15/3/13
- Bài viết:
- 0
- Đã được thích:
- 0
- Điểm thành tích:
[0](members/jin1d.49058/trophies)
- Nơi ở:
[Barbados](misc/location-info?location=Barbados)
- Nghề nghiệp:
- Mozambique
# Jin1d
New Member, đến từ
[Barbados](misc/location-info?location=Barbados)
- Jin1d được nhìn thấy lần cuối:
- 15/3/13
-
- Đang tải...
-
### Giới thiệu
- Nơi ở:
[Barbados](misc/location-info?location=Barbados)
Man
- Nghề nghiệp:
- Mozambique
### Tương tác
- ICQ:
- 372897dgf39


text:
- Hoạt động cuối:
- 24/3/15
- Tham gia ngày:
- 24/3/15
- Bài viết:
- 0
- Đã được thích:
- 0
- Điểm thành tích:
- 0
- Sinh nhật:
- 20/2/94 (Tuổi: 23)
Lâm Thi
New Member, 23
- Lâm Thi được nhìn thấy lần cuối:
- 24/3/15
-
- Đang tải...
-
Giới thiệu
- Sinh nhật:
- 20/2/94 (Tuổi: 23)
Tương tác

markdown:
![ Lâm Thi](http://svnhforum.com/forum/styles/banh/xenforo/avatars/avatar_l.png)
- Hoạt động cuối:
- 24/3/15
- Tham gia ngày:
- 24/3/15
- Bài viết:
- 0
- Đã được thích:
- 0
- Điểm thành tích:
[0](members/lam-thi.107277/trophies)
- Sinh nhật:
- 20/2/94 (Tuổi: 23)
# Lâm Thi
New Member, 23
- Lâm Thi được nhìn thấy lần cuối:
- 24/3/15
-
- Đang tải...
-
### Giới thiệu
- Sinh nhật:
- 20/2/94 (Tuổi: 23)
### Tương tác


text:
Diễn đàn chính thức sinh viên Học viện Ngân Hàng
Trang chủ
Thành viên
>
ngongo
>
Hoạt động cuối:
18/1/14
Tham gia ngày:
18/1/14
Bài viết:
0
Đã được thích:
0
Điểm thành tích:
0
ngongo
New Member
ngongo được nhìn thấy lần cuối:
18/1/14
Tin nhắn hồ sơ
Các bài đăng
Thông tin
Hiện tại không có tin nhắn trong hồ sơ của ngongo.
Show Ignored Content
Đang tải...
Xem
Tương tác
Nội dung:
Tìm tất cả nội dung bởi ngongo
Tìm tất cả chủ đề bởi ngongo
Đăng nhập bằng Facebook
Đăng nhập bằng Google
Tên tài khoản hoặc địa chỉ Email:
Bạn đã có tài khoản rồi?
Tích vào đây để đăng ký
Vâng, Mật khẩu của tôi là:
Bạn đã quên mật khẩu?
Duy trì đăng nhập
Diễn đàn chính thức sinh viên Học viện Ngân Hàng
Trang chủ
Thành viên
>
ngongo
>
Trang chủ
Diễn đàn
Video
Video
Liên kết nhanh
Video ngẫu nhiên
Video
Playlists
Diễn đàn học tập
ĐĂNG NHẬP | ĐĂNG KÝ
Diễn đàn
Liên kết nhanh
Tìm kiếm diễn đàn
Watched Tags
Bài viết gần đây
Menu


text:
- Hoạt động cuối:
- 22/4/14
- Tham gia ngày:
- 22/4/14
- Bài viết:
- 0
- Đã được thích:
- 0
- Điểm thành tích:
- 0
- Sinh nhật:
- 20/11/91 (Tuổi: 25)
phungthinga1191
New Member, 25
- phungthinga1191 được nhìn thấy lần cuối:
- 22/4/14
-
- Đang tải...
-
Giới thiệu
- Sinh nhật:
- 20/11/91 (Tuổi: 25)
Tương tác

markdown:
![ phungthinga1191](http://svnhforum.com/forum/styles/banh/xenforo/avatars/avatar_l.png)
- Hoạt động cuối:
- 22/4/14
- Tham gia ngày:
- 22/4/14
- Bài viết:
- 0
- Đã được thích:
- 0
- Điểm thành tích:
[0](members/phungthinga1191.86629/trophies)
- Sinh nhật:
- 20/11/91 (Tuổi: 25)
# phungthinga1191
New Member, 25
- phungthinga1191 được nhìn thấy lần cuối:
- 22/4/14
-
- Đang tải...
-
### Giới thiệu
- Sinh nhật:
- 20/11/91 (Tuổi: 25)
### Tương tác


text: Hiện nay Fanpage Facebook là facebook marketing một kênh quảng cáo sản phẩm hữu hiệu, với số lượng Fan càng lớn thì Fanpage càng có khả năng http://easyface.vn/ quảng bá đến nhiều người hơn. Vì vậy, chúng tôi cung cấp dịch vụ tăng số lượng Fan cho Fanpage Facebook để giúp quý khách có thể quảng bá sản phẩm đến được nhiều khách hàng một cách hiệu quả nhất dịch vụ tăng like facebook Ưu điểm vượt trội của dịch vụ chúng tôi là: facebook marketing · Đảm bảo 100% like là người like thật sự và là người Việt Nam . · Thời gian thực hiện nhanh và hiệu quả nhất! · Fan đúng đối tượng khách hàng mục tiêu · dịch vụ tăng like facebook Hỗ trợ tư vấn,tăng sự tương tác với khách hàng trên facebook mãi mãi http://easyface.vn/ Báo giá dịch vụ tăng like fanpage: 1. Nhận làm ít nhất 5.000 like facebook marketing 2. Giá: 300đ/like dịch vụ tăng like facebook Liên hệ: Mr. Tú 0946.486.568 dịch vụ tăng like facebook | facebook marketing


text:
C++ P8 : Tái định nghĩa
Chia sẻ: Nhan Nguyen | Ngày: | Loại File: PDF | Số trang:24
lượt xem 35
download
C++ P8 : Tái định nghĩa
Chương này thảo luận về tái định nghĩa hàm và toán tử trong C++. Thuật ngữ tái định nghĩa (overloading) nghĩa là ‘cung cấp nhiều định nghĩa’.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: C++ P8 : Tái định nghĩa
- Chương 8. Tái định nghĩa Chương này thảo luận về tái định nghĩa hàm và toán tử trong C++. Thuật ngữ tái định nghĩa (overloading) nghĩa là ‘cung cấp nhiều định nghĩa’. Tái định nghĩa hàm liên quan đến việc định nghĩa các hàm riêng biệt chia sẻ cùng tên, mỗi hàm có một dấu hiệu duy nhất. Tái định nghĩa hàm thích hợp cho: • Định nghĩa các hàm về bản chất là làm cùng công việc nhưng thao tác trên các kiểu dữ liệu khác nhau. • Cung cấp các giao diện tới cùng hàm. Tái định nghĩa hàm (function overloading) là một tiện lợi trong lập trình. Giống như các hàm, các toán tử nhận các toán hạng (các đối số) và trả về một giá trị. Phần lớn các toán tử C++ có sẵn đã được tái định nghĩa rồi. Ví dụ, toán tử + có thể được sử dụng để cộng hai số nguyên, hai số thực, hoặc hai địa chỉ. Vì thế, nó có nhiều định nghĩa khác nhau. Các định nghĩa xây dựng sẵn cho các toán tử được giới hạn trên những kiểu có sẵn. Các định nghĩa thêm vào có thể được cung cấp bởi các lập trình viên sao cho chúng cũng có thể thao tác trên các kiểu người dùng định nghĩa. Mỗi định nghĩa thêm vào được cài đặt bởi một hàm. Tái định nghĩa các toán tử sẽ được minh họa bằng cách sử dụng một số lớp đơn giản. Chúng ta sẽ thảo luận các qui luật chuyển kiểu có thể được sử dụng như thế nào để rút gọn nhu cầu cho nhiều tái định nghĩa của cùng toán tử. Chúng ta sẽ trình bày các ví dụ của tái định nghĩa một số toán tử phổ biến gồm > cho xuất nhập, [] và () cho các lớp chứa, và các toán tử con trỏ. Chúng ta cũng sẽ thảo luận việc khởi tạo và gán tự động, tầm quan trọng của việc cài đặt chính xác chúng trong các lớp sử dụng các thành viên dữ liệu được cấp phát động. Không giống như các hàm và các toán tử, các lớp không thể được tái định nghĩa; mỗi lớp phải có một tên duy nhất. Tuy nhiên, như chúng ta sẽ thấy trong chương 8, các lớp có thể được sửa đổi và mở rộng thông qua khả năng thừa kế (inheritance). Chương 8: Tái định nghĩa 122
- 8.1. Tái định nghĩa hàm Xem xét một hàm, GetTime, trả về thời gian hiện tại của ngày theo các tham số của nó, và giả sử rằng cần có hai biến thể của hàm này: một trả về thời gian theo giây tính từ nửa đêm, và một trả về thời gian theo giờ, phút, giây. Rõ ràng các hàm này phục vụ cùng mục đích nên không có lý do gì lại để cho chúng có những cái tên khác nhau. C++ cho phép các hàm được tái định nghĩa, nghĩa là cùng hàm có thể có hơn một định nghĩa: long GetTime (void); // số giây tính từ nửa đêm void GetTime (int &hours, int &minutes, int &seconds); Khi hàm GetTime được gọi, trình biên dịch so sánh số lượng và kiểu các đối số trong lời gọi với các định nghĩa của hàm GetTime và chọn một cái khớp với lời gọi. Ví dụ: int h, m, s; long t = GetTime(); // khớp với GetTime(void) GetTime(h, m, s); // khớp với GetTime(int&, int&, int&); Để tránh nhầm lẫn thì mỗi định nghĩa của một hàm được tái định nghĩa phải có một dấu hiệu duy nhất. Các hàm thành viên của một lớp cũng có thể được tái định nghĩa: class Time { //... long GetTime (void); // số giây tính từ nửa đêm void GetTime (int &hours, int &minutes, int &seconds); }; Tái định nghĩa hàm giúp ta thu được nhiều phiên bản đa dạng của hàm mà không thể có được bằng cách sử dụng đơn độc các đối số mặc định. Các hàm được tái định nghĩa cũng có thể có các đối số mặc định: void Error (int errCode, char *errMsg = ""); void Error (char *errMsg); 8.2. Tái định nghĩa toán tử C++ cho phép lập trình viên định nghĩa các ý nghĩa thêm vào cho các toán tử xác định trước của nó bằng cách tái định nghĩa chúng. Ví dụ, chúng ta có thể tái định nghĩa các toán tử + và – để cộng và trừ các đối tượng Point: class Point { public: Point (int x, int y) {Point::x = x; Point::y = y;} Chương 8: Tái định nghĩa 123
- Point operator + (Point &p) {return Point(x + p.x,y + p.y);} Point operator - (Point &p) {return Point(x - p.x,y - p.y);} private: int x, y; }; Sau định nghĩa này thì + và – có thể được sử dụng để cộng và trừ các điểm giống như là chúng được sử dụng để cộng và trừ các số: Point p1(10,20), p2(10,20); Point p3 = p1 + p2; Point p4 = p1 - p2; Việc tái định nghĩa các toán tử + và – như trên sử dụng các hàm thành viên. Một khả năng khác là một toán tử có thể được tái định nghĩa toàn cục: class Point { public: Point (int x, int y) {Point::x = x; Point::y = y;} friend Point operator + (Point &p, Point &q) {return Point(p.x + q.x,p.y + q.y);} friend Point operator - (Point &p, Point &q) {return Point(p.x - q.x,p.y - q.y);} private: int x, y; }; Sử dụng một toán tử đã tái định nghĩa tương đương với một lời gọi rõ ràng tới hàm thi công nó. Ví dụ: operator+(p1, p2) // tương đương với: p1 + p2 Thông thường, để định nghĩa một toán tử λ xác định trước thì chúng ta định nghĩa một hàm tên operator λ . Nếu λ là một toán tử nhị hạng: • operator λ phải nhận chính xác một đối số nếu được định nghĩa như một thành viên của lớp, hoặc hai đối số nếu được định nghĩa toàn cục. Tuy nhiên, nếu λ là một toán tử đơn hạng: • operator λ phải nhận không đối số nếu được định nghĩa như một thành viên của lớp, hoặc một đối số nếu được định nghĩa toàn cục. Bảng 8.1 tổng kết các toán tử C++ có thể được tái định nghĩa. Năm toán tử còn lại không được tái định nghĩa là: . .* :: ?: sizeof Chương 8: Tái định nghĩa 124
- Bảng 8.1 Các toán tử có thể tái định nghĩa. + - * ! ~ & ++ -- () -> ->* Đơn hạng new delete + - * / % & | ^ > = += -= /= %= &= |= ^= > Nhị hạng = = == != < > = & || [] () , & Toán tử đơn hạng (ví dụ ~) không thể được tái định nghĩa như nhị hạng hoặc toán tử nhị hạng (ví dụ =) không thể được tái định nghĩa như toán tử đơn hạng. C++ không hỗ trợ định nghĩa toán tử new bởi vì điều này có thể dẫn đến sự mơ hồ. Hơn nữa, luật ưu tiên cho các toán tử xác định trước cố định và không thể được sửa đổi. Ví dụ, dù cho bạn tái định nghĩa toán tử * như thế nào thì nó sẽ luôn có độ ưu tiên cao hơn toán tử +. Các toán tử ++ và –- có thể được tái định nghĩa như là tiền tố cũng như là hậu tố. Các luật tương đương không được áp dụng cho các toán tử đã tái định nghĩa. Ví dụ, tái định nghĩa + không ảnh hưởng tới += trừ phi toán tử += cũng được tái định nghĩa rõ ràng. Các toán tử ->, =, [], và () chỉ có thể được tái định nghĩa như các hàm thành viên, và không như toàn cục. Để tránh sao chép các đối tượng lớn khi truyền chúng tới các toán tử đã tái định nghĩa thì các tham chiếu nên được sử dụng. Các con trỏ thì không thích hợp cho mục đích này bởi vì một toán tử đã được tái định nghĩa không thể thao tác toàn bộ trên con trỏ. Ví dụ: Các toán tử trên tập hợp Lớp Set được giới thiệu trong chương 6. Phần lớn các hàm thành viên của Set được định nghĩa như là các toán tử tái định nghĩa tốt hơn. Danh sách 8.1 minh họa. Chương 8: Tái định nghĩa 125
- Danh sách 8.1 1 #include 2 const maxCard = 100; 3 enum Bool {false, true}; 4 class Set { 5 public: 6 Set(void) { card = 0; } 7 friend Bool operator & (const int, Set&); // thanh vien 8 friend Bool operator == (Set&, Set&); // bang 9 friend Bool operator != (Set&, Set&); // khong bang 10 friend Set operator * (Set&, Set&); // giao 11 friend Set operator + (Set&, Set&); // hop 12 //... 13 void AddElem(const int elem); 14 void Copy (Set &set); 15 void Print (void); 16 private: 17 int elems[maxCard]; // cac phan tu cua tap hop 18 int card; // so phan tu cua tap hop 19 }; Ở đây, chúng ta phải quyết định định nghĩa các hàm thành viên toán tử như là bạn toàn cục. Chúng có thể được định nghĩa một cách dễ dàng như là hàm thành viên. Việc thi công các hàm này là như sau. Bool operator & (const int elem, Set &set) { for (register i = 0; i < set.card; ++i) if (elem == set.elems[i]) return true; return false; } Bool operator == (Set &set1, Set &set2) { if (set1.card != set2.card) return false; for (register i = 0; i < set1.card; ++i) if (!(set1.elems[i] & set2)) // sử dụng & đã tái định nghĩa return false; return true; } Bool operator != (Set &set1, Set &set2) { return !(set1 == set2); // sử dụng == đã tái định nghĩa } Set operator * (Set &set1, Set &set2) { Set res; for (register i = 0; i < set1.card; ++i) if (set1.elems[i] & set2) // sử dụng & đã tái định nghĩa res.elems[res.card++] = set1.elems[i]; Chương 8: Tái định nghĩa 126
- return res; } Set operator + (Set &set1, Set &set2) { Set res; set1.Copy(res); for (register i = 0; i < set2.card; ++i) res.AddElem(set2.elems[i]); return res; } Cú pháp để sử dụng các toán tử này ngắn gọn hơn cú pháp của các hàm mà chúng thay thế như được minh họa bởi hàm main sau: int main (void) { Set s1, s2, s3; s1.AddElem(10); s1.AddElem(20); s1.AddElem(30); s1.AddElem(40); s2.AddElem(30); s2.AddElem(50); s2.AddElem(10); s2.AddElem(60); cout
- Bất kỳ sự chuyển kiểu nào khác thêm vào phải được định nghĩa bởi lập trình viên. Ví dụ, giả sử chúng ta muốn tái định nghĩa toán tử + cho kiểu Point sao cho nó có thể được sử dụng để cộng hai điểm hoặc cộng một số nguyên tới cả hai tọa độ của một điểm: class Point //... friend Point operator + (Point, Point); friend Point operator + (int, Point); friend Point operator + (Point, int); }; Để làm cho toán tử + có tính giao hoán, chúng ta phải định nghĩa hai hàm để cộng một số nguyên với một điểm: một hàm đối với trường hợp số nguyên là toán hạng đầu tiên và một hàm đối với trường hợp số nguyên là toán hạng thứ hai. Quan sát rằng nếu chúng ta bắt đầu xem xét các kiểu khác thêm vào kiểu int thì tiếp cận này dẫn đến mức độ biến đổi khó kiểm soát của toán tử. Một tiếp cận tốt hơn là sử dụng hàm xây dựng để chuyển đối tượng tới cùng kiểu như chính lớp sao cho một toán tử đã tái định nghĩa có thể điều khiển công việc. Trong trường hợp này, chúng ta cần một hàm xây dựng nhận một int đặc tả cả hai tọa độ của một điểm: class Point { //... Point (int x) { Point::x = Point::y = x; } friend Point operator + (Point, Point); }; Đối với các hàm xây dựng của một đối số thì không cần gọi hàm xây dựng một cách rõ ràng: Point p = 10; // tương đương với: Point p(10); Vì thế có thể viết các biểu thức liên quan đến các biến hoặc hằng thuộc kiểu Point và int bằng cách sử dụng toán tử +. Point p(10,20), q = 0; q = p + 5; // tương đương với: q = p + Point(5); Ở đây, 5 được chuyển tạm thời thành đối tượng Point và sau đó được cộng vào p. Đối tượng tạm sau đó sẽ được hủy đi. Tác động toàn bộ là một chuyển kiểu không tường minh từ int thành Point. Vì thế giá trị cuối của q là (15,25). Cái gì xảy ra nếu chúng ta muốn thực hiện chuyển kiểu ngược lại từ kiểu lớp thành một kiểu khác? Trong trường hợp này các hàm xây dựng không thể được sử dụng bởi vì chúng luôn trả về một đối tượng của lớp mà chúng thuộc về. Để thay thế, một lớp có thể định nghĩa một hàm thành viên mà chuyển rõ ràng một đối tượng thành một kiểu mong muốn. Chương 8: Tái định nghĩa 128
- Ví dụ, với lớp Rectangle đã cho chúng ta có thể định nghĩa một hàm chuyển kiểu thực hiện chuyển một hình chữ nhật thành một điểm bằng cách tái định nghĩa toán tử kiểu Point trong lớp Rectangle: class Rectangle { public: Rectangle (int left, int top, int right, int bottom); Rectangle (Point &p, Point &q); //... operator Point () {return botRight - topLeft;} private: Point topLeft; Point botRight; }; Toán tử này được định nghĩa để chuyển một hình chữ nhật thành một điểm mà tọa độ của nó tiêu biểu cho độ rộng và chiều cao của hình chữ nhật. Vì thế, trong đoạn mã Point p(5,5); Rectangle r(10,10,20,30); r + p; trước hết hình chữ nhật r được chuyển không tường minh thành một đối tượng Point bởi toán tử chuyển kiểu và sau đó được cộng vào p. Chuyển kiểu Point cũng có thể được áp dụng tường minh bằng cách sử dụng ký hiệu ép kiểu thông thường. Ví dụ: Point(r); // ép kiểu tường minh thành Point (Point)r; // ép kiểu tường minh thành Point Thông thường với kiểu người dùng định nghĩa X đã cho và kiểu Y khác (có sẵn hay người dùng định nghĩa) thì: • Hàm xây dựng được định nghĩa cho X nhận một đối số đơn kiểu Y sẽ chuyển không tường minh các đối tượng Y thành các đối tượng X khi được cần. • Tái định nghĩa toán tử Y trong X sẽ chuyển không tường minh các đối tượng X thành các đối tượng Y khi được cần. class X { //... X (Y&); // chuyển Y thành X operator Y (); // chuyển X thành Y }; Một trong những bất lợi của các phương thức chuyển kiểu do người dùng định nghĩa là nếu chúng không được sử dụng một cách hạn chế thì chúng có thể làm cho các hoạt động của chương trình là khó có thể tiên đoán. Cũng có sự rủi ro thêm vào của việc tạo ra sự mơ hồ. Sự mơ hồ xảy ra khi trình biên Chương 8: Tái định nghĩa 129
- dịch có hơn một chọn lựa cho nó để áp dụng các qui luật chuyển kiểu người dùng định nghĩa và vì thế không thể chọn được. Tất cả những trường hợp như thế được báo cáo như những lỗi bởi trình biên dịch. Để minh họa cho các mơ hồ có thể xảy ra, giả sử rằng chúng ta cũng định nghĩa một hàm chuyển kiểu cho lớp Rectangle (nhận một đối số Point) cũng như là tái định nghĩa các toán tử + và -: class Rectangle { public: Rectangle (int left, int top, int right, int bottom); Rectangle (Point &p, Point &q); Rectangle (Point &p); operator Point () {return botRight - topLeft;} friend Rectangle operator + (Rectangle &r, Rectangle &t); friend Rectangle operator - (Rectangle &r, Rectangle &t); private: Point topLeft; Point botRight; }; Bây giờ, trong Point p(5,5); Rectangle r(10,10,20,30); r + p; r + p có thể được thông dịch theo hai cách. Hoặc là r + Rectangle(p) // cho ra một Rectangle hoặc là: Point(r) + p // cho ra một Point Nếu lập trình viên không giải quyết sự mơ hồ bởi việc chuyển kiểu tường minh thì trình biên dịch sẽ từ chối. Ví dụ: Lớp Số Nhị Phân Danh sách 8.2 định nghĩa một lớp tiêu biểu cho các số nguyên nhị phân như là một chuỗi các ký tự 0 và 1. Chương 8: Tái định nghĩa 130
- Danh sách 8.2 1 #include 2 #include 3 int const binSize = 16; // chieu dai so nhi phan la 16 4 class Binary { 5 public: 6 Binary (const char*); 7 Binary (unsigned int); 8 friend Binary operator + (const Binary, const Binary); 9 operator int (); // chuyen kieu 10 void Print (void); 11 private: 12 char bits[binSize]; // cac bit nhi phan 13 }; Chú giải 6 Hàm xây dựng này cung cấp một số nhị phân từ mẫu bit của nó. 7 Hàm xây dựng này chuyển một số nguyên dương thành biểu diễn nhị phân tương đương của nó. 8 Toán tử + được tái định nghĩa để cộng hai số nhị phân. Phép cộng được làm từng bit một. Để đơn giản thì những lỗi tràn được bỏ qua. 9 Toán tử chuyển kiểu này được sử dụng để chuyển một đối tượng Binary thành đối tượng int . 10 Hàm này đơn giản chỉ in mẫu bit của số nhị phân. 12 Mảng này được sử dụng để giữ các bit 0 và 1 của số lượng 1 bit như là các ký tự. Cài đặt các hàm này là như sau: Binary::Binary (const char *num) { int iSrc = strlen(num) - 1; int iDest = binSize - 1; while (iSrc >= 0 && iDest >= 0) // sao chep cac bit bits[iDest--] = (num[iSrc--] == '0' ? '0' : '1'); while (iDest >= 0) // dat cac bit trai ve 0 bits[iDest--] = '0'; } Binary::Binary (unsigned int num) { for (register i = binSize - 1; i >= 0; --i) { bits[i] = (num % 2 == 0 ? '0' : '1'); num >>= 1; } } Binary operator + (const Binary n1, const Binary n2) { unsigned carry = 0; Chương 8: Tái định nghĩa 131
- unsigned value; Binary res = "0"; for (register i = binSize - 1; i >= 0; --i) { value = (n1.bits[i] == '0' ? 0 : 1) + (n2.bits[i] == '0' ? 0 : 1) + carry; res.bits[i] = (value % 2 == 0 ? '0' : '1'); carry = value >> 1; } return res; } Binary::operator int () { unsigned value = 0; for (register i = 0; i < binSize; ++i) value = (value
- Trong trường hợp này thì toán tử chuyển kiểu được áp dụng không tường minh. Kết quả cho bởi chương trình là bằng chứng cho các chuyển kiểu được thực hiện chính xác: 0000000000001011 0000000000011010 0000000000100101 16 6 8.4. Tái định nghĩa toán tử xuất
- Với cách thức đơn giản, kiểu xuất này loại bỏ đi gánh nặng của việc nhớ tên hàm xuất đối với mỗi kiểu người dùng định nghĩa. Trong trường hợp không sử dụng tái định nghĩa theo cùng cách với > nhập các đối tượng kiểu T: istream& operator >> (istream&, T&); Tham số đầu tiên phải là một tham chiếu tới dòng nhập istream sao cho sử dụng nhiều >> có thể được nối vào nhau. Tham số thứ hai phải là một tham chiếu vì nó sẽ được sửa đổi bởi hàm. Tiếp theo lớp Binary chúng ta tái định nghĩa toán tử >> để nhập vào một chuỗi các bit. Nhắc lại, bởi vì toán hạng đầu tiên của toán tử >> phải là một đối tượng istream nên nó không thể được tái định nghĩa như là một hàm thành viên: class Binary { //... friend istream& operator >> (istream&, Binary&); }; istream& operator >> (istream &is, Binary &n) { char str[binSize + 1]; cin >> str; n = Binary(str); // use the constructor for simplicity return is; } Với định nghĩa đã cho này thì toán tử >> có thể được sử dụng để nhập vào các số nhị phân theo cách của các kiểu dữ liệu có sẵn. Ví dụ, Binary n; cin >> n; sẽ đọc một số nhị phân từ bàn phím tới n. Chương 8: Tái định nghĩa 134
- 8.6. Tái định nghĩa [] Danh sách 8.3 định nghĩa một lớp vectơ kết hợp đơn giản. Một vectơ kết hợp là một mảng một chiều mà các phần tử có thể được tìm kiếm bằng nội dung của chúng hơn là vị trí của chúng trong mảng. Trong AssocVec thì mỗi phần tử có một tên dạng chuỗi (thông qua đó nó có thể được tìm kiếm) và một giá trị số nguyên kết hợp. Danh sách 8.3 1 #include 2 #include 3 class AssocVec { 4 public: 5 AssocVec (const int dim); 6 ~AssocVec (void); 7 int& operator [] (const char *idx); 8 private: 9 struct VecElem { 10 char *index; 11 int value; 12 } *elems; // cac phan tu cua vecto 13 int dim; // kich thuoc cua vecto 14 int used; // cac phan tu duoc su dung toi hien tai 15 }; Chú giải 5 Hàm xây dựng tạo ra một vectơ kết hợp có kích cỡ được chỉ định bởi tham số của nó. 7 Toán tử [] đã tái định nghĩa được sử dụng để truy xuất các phần tử của vectơ. Hàm tái định nghĩa [] phải có chính xác một tham số. Với một chuỗi đã cho nó tìm kiếm phần tử tương ứng chứa trong vectơ. Nếu một việc so khớp chỉ số được tìm thấy thì sau đó một tham chiếu tới giá trị kết hợp với nó được trả về. Ngược lại, một phần tử mới được tạo ra và một tham chiếu tới giá trị này được trả về. 12 Các phần tử vectơ được biểu diễn bởi một mảng động của các cấu trúc VecElem. Mỗi phần tử của vectơ gồm một chuỗi (được biểu thị bởi index) và một giá trị số nguyên (được biểu thị bởi value). Thi công của các hàm này như sau: AssocVec::AssocVec (const int dim) { AssocVec::dim = dim; used = 0; elems = new VecElem[dim]; } AssocVec::~AssocVec (void) { Chương 8: Tái định nghĩa 135
- for (register i = 0; i < used; ++i) delete elems[i].index; delete [] elems; } int& AssocVec::operator [] (const char *idx) { for (register i = 0; i < used; ++i) // tim phan tu ton tai if (strcmp(idx,elems[i].index) == 0) return elems[i].value; if (used < dim && // tao ra phan tu moi (elems[used].index = new char[strlen(idx)+1]) != 0) { strcpy(elems[used].index,idx); elems[used].value = used + 1; return elems[used++].value; } static int dummy = 0; return dummy; } Chú ý rằng bởi vì AssocVec::operator[] phải trả về một tham chiếu hợp lệ, một tham chiếu tới một số nguyên tĩnh giả được trả về khi vectơ đầy hay toán tử new thất bại. Một biểu thức tham chiếu là một giá trị trái và vì thế có thể xuất hiện trên cả hai phía của một phép gán. Nếu một hàm trả về một tham chiếu sau đó một lời gọi hàm tới hàm đó có thể được gán tới. Điều này là tại sao kiểu trả về của AssocVec::operator[] được định nghĩa là một tham chiếu. Sử dụng AssocVec chúng ta bây giờ có thể tạo ra các vectơ kết hợp mà xử lý rất giống các vectơ bình thường: AssocVec count(5); count["apple"] = 5; count["orange"] = 10; count["fruit"] = count["apple"] + count["orange"]; Điều này sẽ đặt count["fruit"] tới 15. 8.7. Tái định nghĩa () Danh sách 8.4 định nghĩa một lớp ma trận. Một ma trận là một bảng các giá trị (mảng hai chiều) mà kích thước của nó được biểu thị bởi số hàng và số cột trong bảng. Một ví dụ của ma trận đơn giản 2 x 3 sẽ là: 10 20 30 M= 21 52 19 Chương 8: Tái định nghĩa 136
- Ký hiệu toán học chuẩn để tham khảo các phần tử của ma trận là các dấu ngoặc. Ví dụ phần tử 20 của ma trận M (nghĩa là trong hàng đầu và cột thứ hai) được tham khảo tới như là M(1,2). Đại số học của ma trận cung cấp một tập các thao tác để cài đặt ma trận bao gồm cộng, trừ, nhân, và chia. Danh sách 8.4 1 #include 2 class Matrix { 3 public: 4 Matrix (const short rows, const short cols); 5 ~Matrix (void) {delete elems;} 6 double& operator () (const short row, const short col); 7 friend ostream& operator
- for (register r = 1; r
- Kết quả của việc khởi tạo ngầm định là các thành viên dữ liệu elems của cả hai đối tượng sẽ trỏ tới cùng khối đã được cấp phát động. Tuy nhiên m được hủy nhờ vào trả về của hàm. Do đó các hàm hủy xóa đi khối đã được trỏ tới bởi m.elems bỏ lại thành viên dữ liệu của đối tượng đã trả về đang trỏ tới một khối không hợp lệ! Cuối cùng điều này dẫn đến một thất bại trong khi thực thi chương trình. Hình 8.2 minh họa. Hình 8.2 Lỗi của việc khởi tạo ngầm định sao chép ngầm định của m được tạo sau khi m bị hủy A memberwise copy of m is made After m is destroyed Matrix m rows cols elems sao chép ngầm Memberwise sao chép ngầm Memberwise định của m Copy of m Dynamic Copycủam định of m Invalid rows Block rows Block cols cols elems elems Khởi tạo ngầm định xảy ra trong các tình huống sau: • Khi định nghĩa và khởi tạo một đối tượng trong một câu lệnh khai báo mà sử dụng đối tượng khác như là bộ khởi tạo của nó, ví dụ lệnh khởi tạo Matrix n = m trong hàm Foo bên dưới. • Khi truyền một đối số là đối tượng đến một hàm (không có thể dùng được đối số con trỏ hay tham chiếu), ví dụ m trong hàm Foo bên dưới. • Khi trả về một giá trị đối tượng từ một hàm (không có thể dùng được đối số con trỏ hay tham chiếu), ví dụ return n trong hàm Foo bên dưới. Matrix Foo (Matrix m) // sao chép ngầm định tới m { Matrix n = m; // sao chép ngầm định tới n //... return n; // sao chép ngầm định n và trả về sao chép } Rõ ràng việc khởi tạo ngầm định là thích hợp cho các lớp không có các thành viên dữ liệu con trỏ (ví dụ, lớp Point). Các vấn đề gây ra bởi khởi tạo ngầm định của các lớp khác có thể được tránh bằng cách định nghĩa các hàm xây dựng phụ trách công việc khởi tạo ngầm định một cách rõ ràng. Hàm xây dựng này còn được gọi là hàm xây dựng sao chép. Đối với bất kỳ lớp X đã cho thì hàm xây dựng sao chép luôn có hình thức: X::X (const X&); Ví dụ với lớp Matrix thì điều này có thể được định nghĩa như sau: class Matrix { Chương 8: Tái định nghĩa 139
- Matrix (const Matrix&); //... }; Matrix::Matrix (const Matrix &m) : rows(m.rows), cols(m.cols) { int n = rows * cols; elems = new double[n]; // cùng kích thước for (register i = 0; i < n; ++i) // sao chép các phần tử elems[i] = m.elems[i]; } 8.9. Gán ngầm định Các đối tượng thuộc cùng lớp được gán tới một lớp khác bởi một tái định nghĩa toán tử gán bên trong mà được phát ra tự động bởi trình biên dịch. Ví dụ để điều khiển phép gán trong Matrix m(2,2), n(2,2); //... m = n; trình biên dịch tự động phát ra một hàm bên trong như sau: Matrix& Matrix::operator = (const Matrix &m) { rows = m.rows; cols = m.cols; elems = m.elems; } Điều này giống y hệt như trong việc khởi tạo ngầm định và được gọi là gán ngầm định. Nó cũng có cùng vấn đề như trong khởi tạo ngầm định và có thể khắc phục bằng cách tái định nghĩa toán tử = một cách rõ ràng. Ví dụ đối với lớp Matrix thì việc tái định nghĩa toán tử = sau đây là thích hợp: Matrix& Matrix::operator = (const Matrix &m) { if (rows == m.rows && cols == m.cols) { // phải khớp int n = rows * cols; for (register i = 0; i < n; ++i) // sao chép các phần tử elems[i] = m.elems[i]; } return *this; } Thông thường, đối với bất kỳ lớp X đã cho thì toán tử = được tái định nghĩa bằng thành viên sau của X: X& X::operator = (X&) Chương 8: Tái định nghĩa 140
- Toán tử = chỉ có thể được tái định nghĩa như là thành viên và không thể được định nghĩa toàn cục. 8.10.Tái định nghĩa new và delete Các đối tượng khác nhau thường có kích thước và tần số sử dụng khác nhau. Kết quả là chúng có những yêu cầu bộ nhớ khác nhau. Cụ thể các đối tượng nhỏ không được điều khiển một cách hiệu quả bởi các phiên bản mặc định của toán tử new và delete. Mọi khối được cấp phát bởi toán tử new giữ một vài phí được dùng cho mục đích quản lý. Đối với các đối tượng lớn thì điều này không đáng kể nhưng đối với các đối tượng nhỏ thì phí này có thể lớn hơn chính các khối. Hơn nữa, có quá nhiều khối nhỏ có thể làm chậm chạp dữ dội cho các cấp phát và thu hồi theo sau. Hiệu suất của chương trình bằng cách tạo ra nhiều khối nhỏ tự động có thể được cải thiện đáng kể bởi việc sử dụng một chiến lược quản lý bộ nhớ đơn giản hơn cho các đối tượng này. Các toán tử quản lý lưu trữ động new và delete có thể được tái định nghĩa cho một lớp bằng cách viết chồng lên định nghĩa toàn cục của các toán tử này khi được sử dụng cho các đối tượng của lớp đó. Ví dụ giả sử chúng ta muốn tái định nghĩa toán tử new và delete cho lớp Point sao cho các đối tượng Point được cấp phát từ một mảng: #include #include const int maxPoints = 512; class Point { public: //... void* operator new (size_t bytes); void operator delete (void *ptr, size_t bytes); private: int xVal, yVal; static union Block { int xy[2]; Block *next; } *blocks; // tro toi cac luu tru ranh static Block *freeList; // ds ranh cua cac khoi da lien ket static int used; // cac khoi duoc dung }; Tên kiểu size_t được định nghĩa trong stddef.h.. Toán tử new sẽ luôn trả về void*. Tham số của new là kích thước của khối được cấp phát (tính theo byte). Đối số tương ứng luôn được truyền một cách tự động tới trình biên dịch. Tham số đầu của toán tử delete là khối được xóa. Tham số hai (tùy chọn) là Chương 8: Tái định nghĩa 141
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Chương 8. Tái định nghĩa
24 p | 189 | 82
-
Lập trình C++ Chương 8: Tái định nghĩa
24 p | 218 | 56
-
Giáo trình C++/ Chương 8: Tái định nghĩa
24 p | 105 | 31
-
CHƯƠNG 8: TÁI ĐỊNH NGHĨA (OVERLOADING)
18 p | 254 | 29
-
Các kiểu dữ liệu tự định nghĩa
5 p | 178 | 28
-
Những chủ đề tiến bộ trong C# - Các ép kiểu do người dùng định nghĩa – Phần 1
12 p | 97 | 14
-
Chương 8 - Hàm bạn, định nghĩa phép toán cho lớp
17 p | 101 | 14
-
Kỹ thuật lập trình C/C++-Chương: Định nghĩa chồng hàm
21 p | 55 | 11
-
Bài giảng Lập trình hướng đối tượng - Chương 3: Định nghĩa phép toán
92 p | 42 | 11
-
Bài giảng Lập trình hướng đối tượng C++: Chương 8 - ĐH Cần Thơ
18 p | 36 | 10
-
Giáo trình C++_hàm bạn, định nghĩa phép toán cho lớp
17 p | 43 | 6
-
HƯỚNG DẪN 9 CHƯƠNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG C: Tái định nghĩa_CHUONG 8
24 p | 28 | 4
-
Bài giảng Kỹ thuật lập trình: Chương 4 - Trần Quang Hải Bằng
4 p | 13 | 2
-
Bài giảng Lập trình hướng đối tượng: Operator và others - Trần Phước Tuấn
10 p | 11 | 2
-
Lập trình C - Chương 8: Tái định nghĩa
24 p | 41 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 7 - Trần Quang Hải Bằng
3 p | 9 | 2
-
Bài giảng Lập trình hướng đối tượng: Định nghĩa phép toán Operator Overloading
96 p | 11 | 1

markdown:
# C++ P8 : Tái định nghĩa
Chia sẻ: Nhan Nguyen | Ngày: | Loại File: PDF | Số trang:24
lượt xem 35
download
![](http://image1.tailieu.vn/document/thumbnail/2009/20091116/nguyen4/80x100/chuong_08_tai_dinh_nghia_3278.jpg)
##
C++ P8 : Tái định nghĩa
[Vui lòng tải xuống để xem tài liệu đầy đủ](javascript:void(0);)
Download
![](http://static1.tailieu.vn/b2013az/templates/version1/default/images/down16x21.png)
Chương này thảo luận về tái định nghĩa hàm và toán tử trong C++. Thuật ngữ tái định nghĩa (overloading) nghĩa là ‘cung cấp nhiều định nghĩa’.
Bình luận(0)
[Đăng nhập để gửi bình luận!](javascript:void(0);)
##
Nội dung Text: C++ P8 : Tái định nghĩa
- Chương 8. Tái định nghĩa Chương này thảo luận về tái định nghĩa hàm và toán tử trong C++. Thuật ngữ tái định nghĩa (overloading) nghĩa là ‘cung cấp nhiều định nghĩa’. Tái định nghĩa hàm liên quan đến việc định nghĩa các hàm riêng biệt chia sẻ cùng tên, mỗi hàm có một dấu hiệu duy nhất. Tái định nghĩa hàm thích hợp cho: • Định nghĩa các hàm về bản chất là làm cùng công việc nhưng thao tác trên các kiểu dữ liệu khác nhau. • Cung cấp các giao diện tới cùng hàm. Tái định nghĩa hàm (function overloading) là một tiện lợi trong lập trình. Giống như các hàm, các toán tử nhận các toán hạng (các đối số) và trả về một giá trị. Phần lớn các toán tử C++ có sẵn đã được tái định nghĩa rồi. Ví dụ, toán tử + có thể được sử dụng để cộng hai số nguyên, hai số thực, hoặc hai địa chỉ. Vì thế, nó có nhiều định nghĩa khác nhau. Các định nghĩa xây dựng sẵn cho các toán tử được giới hạn trên những kiểu có sẵn. Các định nghĩa thêm vào có thể được cung cấp bởi các lập trình viên sao cho chúng cũng có thể thao tác trên các kiểu người dùng định nghĩa. Mỗi định nghĩa thêm vào được cài đặt bởi một hàm. Tái định nghĩa các toán tử sẽ được minh họa bằng cách sử dụng một số lớp đơn giản. Chúng ta sẽ thảo luận các qui luật chuyển kiểu có thể được sử dụng như thế nào để rút gọn nhu cầu cho nhiều tái định nghĩa của cùng toán tử. Chúng ta sẽ trình bày các ví dụ của tái định nghĩa một số toán tử phổ biến gồm > cho xuất nhập, [] và () cho các lớp chứa, và các toán tử con trỏ. Chúng ta cũng sẽ thảo luận việc khởi tạo và gán tự động, tầm quan trọng của việc cài đặt chính xác chúng trong các lớp sử dụng các thành viên dữ liệu được cấp phát động. Không giống như các hàm và các toán tử, các lớp không thể được tái định nghĩa; mỗi lớp phải có một tên duy nhất. Tuy nhiên, như chúng ta sẽ thấy trong chương 8, các lớp có thể được sửa đổi và mở rộng thông qua khả năng thừa kế (inheritance). Chương 8: Tái định nghĩa 122
- 8.1. Tái định nghĩa hàm Xem xét một hàm, GetTime, trả về thời gian hiện tại của ngày theo các tham số của nó, và giả sử rằng cần có hai biến thể của hàm này: một trả về thời gian theo giây tính từ nửa đêm, và một trả về thời gian theo giờ, phút, giây. Rõ ràng các hàm này phục vụ cùng mục đích nên không có lý do gì lại để cho chúng có những cái tên khác nhau. C++ cho phép các hàm được tái định nghĩa, nghĩa là cùng hàm có thể có hơn một định nghĩa: long GetTime (void); // số giây tính từ nửa đêm void GetTime (int &hours, int &minutes, int &seconds); Khi hàm GetTime được gọi, trình biên dịch so sánh số lượng và kiểu các đối số trong lời gọi với các định nghĩa của hàm GetTime và chọn một cái khớp với lời gọi. Ví dụ: int h, m, s; long t = GetTime(); // khớp với GetTime(void) GetTime(h, m, s); // khớp với GetTime(int&, int&, int&); Để tránh nhầm lẫn thì mỗi định nghĩa của một hàm được tái định nghĩa phải có một dấu hiệu duy nhất. Các hàm thành viên của một lớp cũng có thể được tái định nghĩa: class Time { //... long GetTime (void); // số giây tính từ nửa đêm void GetTime (int &hours, int &minutes, int &seconds); }; Tái định nghĩa hàm giúp ta thu được nhiều phiên bản đa dạng của hàm mà không thể có được bằng cách sử dụng đơn độc các đối số mặc định. Các hàm được tái định nghĩa cũng có thể có các đối số mặc định: void Error (int errCode, char *errMsg = ""); void Error (char *errMsg); 8.2. Tái định nghĩa toán tử C++ cho phép lập trình viên định nghĩa các ý nghĩa thêm vào cho các toán tử xác định trước của nó bằng cách tái định nghĩa chúng. Ví dụ, chúng ta có thể tái định nghĩa các toán tử + và – để cộng và trừ các đối tượng Point: class Point { public: Point (int x, int y) {Point::x = x; Point::y = y;} Chương 8: Tái định nghĩa 123
- Point operator + (Point &p) {return Point(x + p.x,y + p.y);} Point operator - (Point &p) {return Point(x - p.x,y - p.y);} private: int x, y; }; Sau định nghĩa này thì + và – có thể được sử dụng để cộng và trừ các điểm giống như là chúng được sử dụng để cộng và trừ các số: Point p1(10,20), p2(10,20); Point p3 = p1 + p2; Point p4 = p1 - p2; Việc tái định nghĩa các toán tử + và – như trên sử dụng các hàm thành viên. Một khả năng khác là một toán tử có thể được tái định nghĩa toàn cục: class Point { public: Point (int x, int y) {Point::x = x; Point::y = y;} friend Point operator + (Point &p, Point &q) {return Point(p.x + q.x,p.y + q.y);} friend Point operator - (Point &p, Point &q) {return Point(p.x - q.x,p.y - q.y);} private: int x, y; }; Sử dụng một toán tử đã tái định nghĩa tương đương với một lời gọi rõ ràng tới hàm thi công nó. Ví dụ: operator+(p1, p2) // tương đương với: p1 + p2 Thông thường, để định nghĩa một toán tử λ xác định trước thì chúng ta định nghĩa một hàm tên operator λ . Nếu λ là một toán tử nhị hạng: • operator λ phải nhận chính xác một đối số nếu được định nghĩa như một thành viên của lớp, hoặc hai đối số nếu được định nghĩa toàn cục. Tuy nhiên, nếu λ là một toán tử đơn hạng: • operator λ phải nhận không đối số nếu được định nghĩa như một thành viên của lớp, hoặc một đối số nếu được định nghĩa toàn cục. Bảng 8.1 tổng kết các toán tử C++ có thể được tái định nghĩa. Năm toán tử còn lại không được tái định nghĩa là: . .* :: ?: sizeof Chương 8: Tái định nghĩa 124
- Bảng 8.1 Các toán tử có thể tái định nghĩa. + - * ! ~ & ++ -- () -> ->* Đơn hạng new delete + - * / % & | ^ > = += -= /= %= &= |= ^= > Nhị hạng = = == != < > = & || [] () , & Toán tử đơn hạng (ví dụ ~) không thể được tái định nghĩa như nhị hạng hoặc toán tử nhị hạng (ví dụ =) không thể được tái định nghĩa như toán tử đơn hạng. C++ không hỗ trợ định nghĩa toán tử new bởi vì điều này có thể dẫn đến sự mơ hồ. Hơn nữa, luật ưu tiên cho các toán tử xác định trước cố định và không thể được sửa đổi. Ví dụ, dù cho bạn tái định nghĩa toán tử * như thế nào thì nó sẽ luôn có độ ưu tiên cao hơn toán tử +. Các toán tử ++ và –- có thể được tái định nghĩa như là tiền tố cũng như là hậu tố. Các luật tương đương không được áp dụng cho các toán tử đã tái định nghĩa. Ví dụ, tái định nghĩa + không ảnh hưởng tới += trừ phi toán tử += cũng được tái định nghĩa rõ ràng. Các toán tử ->, =, [], và () chỉ có thể được tái định nghĩa như các hàm thành viên, và không như toàn cục. Để tránh sao chép các đối tượng lớn khi truyền chúng tới các toán tử đã tái định nghĩa thì các tham chiếu nên được sử dụng. Các con trỏ thì không thích hợp cho mục đích này bởi vì một toán tử đã được tái định nghĩa không thể thao tác toàn bộ trên con trỏ. Ví dụ: Các toán tử trên tập hợp Lớp Set được giới thiệu trong chương 6. Phần lớn các hàm thành viên của Set được định nghĩa như là các toán tử tái định nghĩa tốt hơn. Danh sách 8.1 minh họa. Chương 8: Tái định nghĩa 125
- Danh sách 8.1 1 #include 2 const maxCard = 100; 3 enum Bool {false, true}; 4 class Set { 5 public: 6 Set(void) { card = 0; } 7 friend Bool operator & (const int, Set&); // thanh vien 8 friend Bool operator == (Set&, Set&); // bang 9 friend Bool operator != (Set&, Set&); // khong bang 10 friend Set operator * (Set&, Set&); // giao 11 friend Set operator + (Set&, Set&); // hop 12 //... 13 void AddElem(const int elem); 14 void Copy (Set &set); 15 void Print (void); 16 private: 17 int elems[maxCard]; // cac phan tu cua tap hop 18 int card; // so phan tu cua tap hop 19 }; Ở đây, chúng ta phải quyết định định nghĩa các hàm thành viên toán tử như là bạn toàn cục. Chúng có thể được định nghĩa một cách dễ dàng như là hàm thành viên. Việc thi công các hàm này là như sau. Bool operator & (const int elem, Set &set) { for (register i = 0; i < set.card; ++i) if (elem == set.elems[i]) return true; return false; } Bool operator == (Set &set1, Set &set2) { if (set1.card != set2.card) return false; for (register i = 0; i < set1.card; ++i) if (!(set1.elems[i] & set2)) // sử dụng & đã tái định nghĩa return false; return true; } Bool operator != (Set &set1, Set &set2) { return !(set1 == set2); // sử dụng == đã tái định nghĩa } Set operator * (Set &set1, Set &set2) { Set res; for (register i = 0; i < set1.card; ++i) if (set1.elems[i] & set2) // sử dụng & đã tái định nghĩa res.elems[res.card++] = set1.elems[i]; Chương 8: Tái định nghĩa 126
- return res; } Set operator + (Set &set1, Set &set2) { Set res; set1.Copy(res); for (register i = 0; i < set2.card; ++i) res.AddElem(set2.elems[i]); return res; } Cú pháp để sử dụng các toán tử này ngắn gọn hơn cú pháp của các hàm mà chúng thay thế như được minh họa bởi hàm main sau: int main (void) { Set s1, s2, s3; s1.AddElem(10); s1.AddElem(20); s1.AddElem(30); s1.AddElem(40); s2.AddElem(30); s2.AddElem(50); s2.AddElem(10); s2.AddElem(60); cout
- Bất kỳ sự chuyển kiểu nào khác thêm vào phải được định nghĩa bởi lập trình viên. Ví dụ, giả sử chúng ta muốn tái định nghĩa toán tử + cho kiểu Point sao cho nó có thể được sử dụng để cộng hai điểm hoặc cộng một số nguyên tới cả hai tọa độ của một điểm: class Point //... friend Point operator + (Point, Point); friend Point operator + (int, Point); friend Point operator + (Point, int); }; Để làm cho toán tử + có tính giao hoán, chúng ta phải định nghĩa hai hàm để cộng một số nguyên với một điểm: một hàm đối với trường hợp số nguyên là toán hạng đầu tiên và một hàm đối với trường hợp số nguyên là toán hạng thứ hai. Quan sát rằng nếu chúng ta bắt đầu xem xét các kiểu khác thêm vào kiểu int thì tiếp cận này dẫn đến mức độ biến đổi khó kiểm soát của toán tử. Một tiếp cận tốt hơn là sử dụng hàm xây dựng để chuyển đối tượng tới cùng kiểu như chính lớp sao cho một toán tử đã tái định nghĩa có thể điều khiển công việc. Trong trường hợp này, chúng ta cần một hàm xây dựng nhận một int đặc tả cả hai tọa độ của một điểm: class Point { //... Point (int x) { Point::x = Point::y = x; } friend Point operator + (Point, Point); }; Đối với các hàm xây dựng của một đối số thì không cần gọi hàm xây dựng một cách rõ ràng: Point p = 10; // tương đương với: Point p(10); Vì thế có thể viết các biểu thức liên quan đến các biến hoặc hằng thuộc kiểu Point và int bằng cách sử dụng toán tử +. Point p(10,20), q = 0; q = p + 5; // tương đương với: q = p + Point(5); Ở đây, 5 được chuyển tạm thời thành đối tượng Point và sau đó được cộng vào p. Đối tượng tạm sau đó sẽ được hủy đi. Tác động toàn bộ là một chuyển kiểu không tường minh từ int thành Point. Vì thế giá trị cuối của q là (15,25). Cái gì xảy ra nếu chúng ta muốn thực hiện chuyển kiểu ngược lại từ kiểu lớp thành một kiểu khác? Trong trường hợp này các hàm xây dựng không thể được sử dụng bởi vì chúng luôn trả về một đối tượng của lớp mà chúng thuộc về. Để thay thế, một lớp có thể định nghĩa một hàm thành viên mà chuyển rõ ràng một đối tượng thành một kiểu mong muốn. Chương 8: Tái định nghĩa 128
- Ví dụ, với lớp Rectangle đã cho chúng ta có thể định nghĩa một hàm chuyển kiểu thực hiện chuyển một hình chữ nhật thành một điểm bằng cách tái định nghĩa toán tử kiểu Point trong lớp Rectangle: class Rectangle { public: Rectangle (int left, int top, int right, int bottom); Rectangle (Point &p, Point &q); //... operator Point () {return botRight - topLeft;} private: Point topLeft; Point botRight; }; Toán tử này được định nghĩa để chuyển một hình chữ nhật thành một điểm mà tọa độ của nó tiêu biểu cho độ rộng và chiều cao của hình chữ nhật. Vì thế, trong đoạn mã Point p(5,5); Rectangle r(10,10,20,30); r + p; trước hết hình chữ nhật r được chuyển không tường minh thành một đối tượng Point bởi toán tử chuyển kiểu và sau đó được cộng vào p. Chuyển kiểu Point cũng có thể được áp dụng tường minh bằng cách sử dụng ký hiệu ép kiểu thông thường. Ví dụ: Point(r); // ép kiểu tường minh thành Point (Point)r; // ép kiểu tường minh thành Point Thông thường với kiểu người dùng định nghĩa X đã cho và kiểu Y khác (có sẵn hay người dùng định nghĩa) thì: • Hàm xây dựng được định nghĩa cho X nhận một đối số đơn kiểu Y sẽ chuyển không tường minh các đối tượng Y thành các đối tượng X khi được cần. • Tái định nghĩa toán tử Y trong X sẽ chuyển không tường minh các đối tượng X thành các đối tượng Y khi được cần. class X { //... X (Y&); // chuyển Y thành X operator Y (); // chuyển X thành Y }; Một trong những bất lợi của các phương thức chuyển kiểu do người dùng định nghĩa là nếu chúng không được sử dụng một cách hạn chế thì chúng có thể làm cho các hoạt động của chương trình là khó có thể tiên đoán. Cũng có sự rủi ro thêm vào của việc tạo ra sự mơ hồ. Sự mơ hồ xảy ra khi trình biên Chương 8: Tái định nghĩa 129
- dịch có hơn một chọn lựa cho nó để áp dụng các qui luật chuyển kiểu người dùng định nghĩa và vì thế không thể chọn được. Tất cả những trường hợp như thế được báo cáo như những lỗi bởi trình biên dịch. Để minh họa cho các mơ hồ có thể xảy ra, giả sử rằng chúng ta cũng định nghĩa một hàm chuyển kiểu cho lớp Rectangle (nhận một đối số Point) cũng như là tái định nghĩa các toán tử + và -: class Rectangle { public: Rectangle (int left, int top, int right, int bottom); Rectangle (Point &p, Point &q); Rectangle (Point &p); operator Point () {return botRight - topLeft;} friend Rectangle operator + (Rectangle &r, Rectangle &t); friend Rectangle operator - (Rectangle &r, Rectangle &t); private: Point topLeft; Point botRight; }; Bây giờ, trong Point p(5,5); Rectangle r(10,10,20,30); r + p; r + p có thể được thông dịch theo hai cách. Hoặc là r + Rectangle(p) // cho ra một Rectangle hoặc là: Point(r) + p // cho ra một Point Nếu lập trình viên không giải quyết sự mơ hồ bởi việc chuyển kiểu tường minh thì trình biên dịch sẽ từ chối. Ví dụ: Lớp Số Nhị Phân Danh sách 8.2 định nghĩa một lớp tiêu biểu cho các số nguyên nhị phân như là một chuỗi các ký tự 0 và 1. Chương 8: Tái định nghĩa 130
- Danh sách 8.2 1 #include 2 #include 3 int const binSize = 16; // chieu dai so nhi phan la 16 4 class Binary { 5 public: 6 Binary (const char*); 7 Binary (unsigned int); 8 friend Binary operator + (const Binary, const Binary); 9 operator int (); // chuyen kieu 10 void Print (void); 11 private: 12 char bits[binSize]; // cac bit nhi phan 13 }; Chú giải 6 Hàm xây dựng này cung cấp một số nhị phân từ mẫu bit của nó. 7 Hàm xây dựng này chuyển một số nguyên dương thành biểu diễn nhị phân tương đương của nó. 8 Toán tử + được tái định nghĩa để cộng hai số nhị phân. Phép cộng được làm từng bit một. Để đơn giản thì những lỗi tràn được bỏ qua. 9 Toán tử chuyển kiểu này được sử dụng để chuyển một đối tượng Binary thành đối tượng int . 10 Hàm này đơn giản chỉ in mẫu bit của số nhị phân. 12 Mảng này được sử dụng để giữ các bit 0 và 1 của số lượng 1 bit như là các ký tự. Cài đặt các hàm này là như sau: Binary::Binary (const char *num) { int iSrc = strlen(num) - 1; int iDest = binSize - 1; while (iSrc >= 0 && iDest >= 0) // sao chep cac bit bits[iDest--] = (num[iSrc--] == '0' ? '0' : '1'); while (iDest >= 0) // dat cac bit trai ve 0 bits[iDest--] = '0'; } Binary::Binary (unsigned int num) { for (register i = binSize - 1; i >= 0; --i) { bits[i] = (num % 2 == 0 ? '0' : '1'); num >>= 1; } } Binary operator + (const Binary n1, const Binary n2) { unsigned carry = 0; Chương 8: Tái định nghĩa 131
- unsigned value; Binary res = "0"; for (register i = binSize - 1; i >= 0; --i) { value = (n1.bits[i] == '0' ? 0 : 1) + (n2.bits[i] == '0' ? 0 : 1) + carry; res.bits[i] = (value % 2 == 0 ? '0' : '1'); carry = value >> 1; } return res; } Binary::operator int () { unsigned value = 0; for (register i = 0; i < binSize; ++i) value = (value
- Trong trường hợp này thì toán tử chuyển kiểu được áp dụng không tường minh. Kết quả cho bởi chương trình là bằng chứng cho các chuyển kiểu được thực hiện chính xác: 0000000000001011 0000000000011010 0000000000100101 16 6 8.4. Tái định nghĩa toán tử xuất
- Với cách thức đơn giản, kiểu xuất này loại bỏ đi gánh nặng của việc nhớ tên hàm xuất đối với mỗi kiểu người dùng định nghĩa. Trong trường hợp không sử dụng tái định nghĩa theo cùng cách với > nhập các đối tượng kiểu T: istream& operator >> (istream&, T&); Tham số đầu tiên phải là một tham chiếu tới dòng nhập istream sao cho sử dụng nhiều >> có thể được nối vào nhau. Tham số thứ hai phải là một tham chiếu vì nó sẽ được sửa đổi bởi hàm. Tiếp theo lớp Binary chúng ta tái định nghĩa toán tử >> để nhập vào một chuỗi các bit. Nhắc lại, bởi vì toán hạng đầu tiên của toán tử >> phải là một đối tượng istream nên nó không thể được tái định nghĩa như là một hàm thành viên: class Binary { //... friend istream& operator >> (istream&, Binary&); }; istream& operator >> (istream &is, Binary &n) { char str[binSize + 1]; cin >> str; n = Binary(str); // use the constructor for simplicity return is; } Với định nghĩa đã cho này thì toán tử >> có thể được sử dụng để nhập vào các số nhị phân theo cách của các kiểu dữ liệu có sẵn. Ví dụ, Binary n; cin >> n; sẽ đọc một số nhị phân từ bàn phím tới n. Chương 8: Tái định nghĩa 134
- 8.6. Tái định nghĩa [] Danh sách 8.3 định nghĩa một lớp vectơ kết hợp đơn giản. Một vectơ kết hợp là một mảng một chiều mà các phần tử có thể được tìm kiếm bằng nội dung của chúng hơn là vị trí của chúng trong mảng. Trong AssocVec thì mỗi phần tử có một tên dạng chuỗi (thông qua đó nó có thể được tìm kiếm) và một giá trị số nguyên kết hợp. Danh sách 8.3 1 #include 2 #include 3 class AssocVec { 4 public: 5 AssocVec (const int dim); 6 ~AssocVec (void); 7 int& operator [] (const char *idx); 8 private: 9 struct VecElem { 10 char *index; 11 int value; 12 } *elems; // cac phan tu cua vecto 13 int dim; // kich thuoc cua vecto 14 int used; // cac phan tu duoc su dung toi hien tai 15 }; Chú giải 5 Hàm xây dựng tạo ra một vectơ kết hợp có kích cỡ được chỉ định bởi tham số của nó. 7 Toán tử [] đã tái định nghĩa được sử dụng để truy xuất các phần tử của vectơ. Hàm tái định nghĩa [] phải có chính xác một tham số. Với một chuỗi đã cho nó tìm kiếm phần tử tương ứng chứa trong vectơ. Nếu một việc so khớp chỉ số được tìm thấy thì sau đó một tham chiếu tới giá trị kết hợp với nó được trả về. Ngược lại, một phần tử mới được tạo ra và một tham chiếu tới giá trị này được trả về. 12 Các phần tử vectơ được biểu diễn bởi một mảng động của các cấu trúc VecElem. Mỗi phần tử của vectơ gồm một chuỗi (được biểu thị bởi index) và một giá trị số nguyên (được biểu thị bởi value). Thi công của các hàm này như sau: AssocVec::AssocVec (const int dim) { AssocVec::dim = dim; used = 0; elems = new VecElem[dim]; } AssocVec::~AssocVec (void) { Chương 8: Tái định nghĩa 135
- for (register i = 0; i < used; ++i) delete elems[i].index; delete [] elems; } int& AssocVec::operator [] (const char *idx) { for (register i = 0; i < used; ++i) // tim phan tu ton tai if (strcmp(idx,elems[i].index) == 0) return elems[i].value; if (used < dim && // tao ra phan tu moi (elems[used].index = new char[strlen(idx)+1]) != 0) { strcpy(elems[used].index,idx); elems[used].value = used + 1; return elems[used++].value; } static int dummy = 0; return dummy; } Chú ý rằng bởi vì AssocVec::operator[] phải trả về một tham chiếu hợp lệ, một tham chiếu tới một số nguyên tĩnh giả được trả về khi vectơ đầy hay toán tử new thất bại. Một biểu thức tham chiếu là một giá trị trái và vì thế có thể xuất hiện trên cả hai phía của một phép gán. Nếu một hàm trả về một tham chiếu sau đó một lời gọi hàm tới hàm đó có thể được gán tới. Điều này là tại sao kiểu trả về của AssocVec::operator[] được định nghĩa là một tham chiếu. Sử dụng AssocVec chúng ta bây giờ có thể tạo ra các vectơ kết hợp mà xử lý rất giống các vectơ bình thường: AssocVec count(5); count["apple"] = 5; count["orange"] = 10; count["fruit"] = count["apple"] + count["orange"]; Điều này sẽ đặt count["fruit"] tới 15. 8.7. Tái định nghĩa () Danh sách 8.4 định nghĩa một lớp ma trận. Một ma trận là một bảng các giá trị (mảng hai chiều) mà kích thước của nó được biểu thị bởi số hàng và số cột trong bảng. Một ví dụ của ma trận đơn giản 2 x 3 sẽ là: 10 20 30 M= 21 52 19 Chương 8: Tái định nghĩa 136
- Ký hiệu toán học chuẩn để tham khảo các phần tử của ma trận là các dấu ngoặc. Ví dụ phần tử 20 của ma trận M (nghĩa là trong hàng đầu và cột thứ hai) được tham khảo tới như là M(1,2). Đại số học của ma trận cung cấp một tập các thao tác để cài đặt ma trận bao gồm cộng, trừ, nhân, và chia. Danh sách 8.4 1 #include 2 class Matrix { 3 public: 4 Matrix (const short rows, const short cols); 5 ~Matrix (void) {delete elems;} 6 double& operator () (const short row, const short col); 7 friend ostream& operator
- for (register r = 1; r
- Kết quả của việc khởi tạo ngầm định là các thành viên dữ liệu elems của cả hai đối tượng sẽ trỏ tới cùng khối đã được cấp phát động. Tuy nhiên m được hủy nhờ vào trả về của hàm. Do đó các hàm hủy xóa đi khối đã được trỏ tới bởi m.elems bỏ lại thành viên dữ liệu của đối tượng đã trả về đang trỏ tới một khối không hợp lệ! Cuối cùng điều này dẫn đến một thất bại trong khi thực thi chương trình. Hình 8.2 minh họa. Hình 8.2 Lỗi của việc khởi tạo ngầm định sao chép ngầm định của m được tạo sau khi m bị hủy A memberwise copy of m is made After m is destroyed Matrix m rows cols elems sao chép ngầm Memberwise sao chép ngầm Memberwise định của m Copy of m Dynamic Copycủam định of m Invalid rows Block rows Block cols cols elems elems Khởi tạo ngầm định xảy ra trong các tình huống sau: • Khi định nghĩa và khởi tạo một đối tượng trong một câu lệnh khai báo mà sử dụng đối tượng khác như là bộ khởi tạo của nó, ví dụ lệnh khởi tạo Matrix n = m trong hàm Foo bên dưới. • Khi truyền một đối số là đối tượng đến một hàm (không có thể dùng được đối số con trỏ hay tham chiếu), ví dụ m trong hàm Foo bên dưới. • Khi trả về một giá trị đối tượng từ một hàm (không có thể dùng được đối số con trỏ hay tham chiếu), ví dụ return n trong hàm Foo bên dưới. Matrix Foo (Matrix m) // sao chép ngầm định tới m { Matrix n = m; // sao chép ngầm định tới n //... return n; // sao chép ngầm định n và trả về sao chép } Rõ ràng việc khởi tạo ngầm định là thích hợp cho các lớp không có các thành viên dữ liệu con trỏ (ví dụ, lớp Point). Các vấn đề gây ra bởi khởi tạo ngầm định của các lớp khác có thể được tránh bằng cách định nghĩa các hàm xây dựng phụ trách công việc khởi tạo ngầm định một cách rõ ràng. Hàm xây dựng này còn được gọi là hàm xây dựng sao chép. Đối với bất kỳ lớp X đã cho thì hàm xây dựng sao chép luôn có hình thức: X::X (const X&); Ví dụ với lớp Matrix thì điều này có thể được định nghĩa như sau: class Matrix { Chương 8: Tái định nghĩa 139
- Matrix (const Matrix&); //... }; Matrix::Matrix (const Matrix &m) : rows(m.rows), cols(m.cols) { int n = rows * cols; elems = new double[n]; // cùng kích thước for (register i = 0; i < n; ++i) // sao chép các phần tử elems[i] = m.elems[i]; } 8.9. Gán ngầm định Các đối tượng thuộc cùng lớp được gán tới một lớp khác bởi một tái định nghĩa toán tử gán bên trong mà được phát ra tự động bởi trình biên dịch. Ví dụ để điều khiển phép gán trong Matrix m(2,2), n(2,2); //... m = n; trình biên dịch tự động phát ra một hàm bên trong như sau: Matrix& Matrix::operator = (const Matrix &m) { rows = m.rows; cols = m.cols; elems = m.elems; } Điều này giống y hệt như trong việc khởi tạo ngầm định và được gọi là gán ngầm định. Nó cũng có cùng vấn đề như trong khởi tạo ngầm định và có thể khắc phục bằng cách tái định nghĩa toán tử = một cách rõ ràng. Ví dụ đối với lớp Matrix thì việc tái định nghĩa toán tử = sau đây là thích hợp: Matrix& Matrix::operator = (const Matrix &m) { if (rows == m.rows && cols == m.cols) { // phải khớp int n = rows * cols; for (register i = 0; i < n; ++i) // sao chép các phần tử elems[i] = m.elems[i]; } return *this; } Thông thường, đối với bất kỳ lớp X đã cho thì toán tử = được tái định nghĩa bằng thành viên sau của X: X& X::operator = (X&) Chương 8: Tái định nghĩa 140
- Toán tử = chỉ có thể được tái định nghĩa như là thành viên và không thể được định nghĩa toàn cục. 8.10.Tái định nghĩa new và delete Các đối tượng khác nhau thường có kích thước và tần số sử dụng khác nhau. Kết quả là chúng có những yêu cầu bộ nhớ khác nhau. Cụ thể các đối tượng nhỏ không được điều khiển một cách hiệu quả bởi các phiên bản mặc định của toán tử new và delete. Mọi khối được cấp phát bởi toán tử new giữ một vài phí được dùng cho mục đích quản lý. Đối với các đối tượng lớn thì điều này không đáng kể nhưng đối với các đối tượng nhỏ thì phí này có thể lớn hơn chính các khối. Hơn nữa, có quá nhiều khối nhỏ có thể làm chậm chạp dữ dội cho các cấp phát và thu hồi theo sau. Hiệu suất của chương trình bằng cách tạo ra nhiều khối nhỏ tự động có thể được cải thiện đáng kể bởi việc sử dụng một chiến lược quản lý bộ nhớ đơn giản hơn cho các đối tượng này. Các toán tử quản lý lưu trữ động new và delete có thể được tái định nghĩa cho một lớp bằng cách viết chồng lên định nghĩa toàn cục của các toán tử này khi được sử dụng cho các đối tượng của lớp đó. Ví dụ giả sử chúng ta muốn tái định nghĩa toán tử new và delete cho lớp Point sao cho các đối tượng Point được cấp phát từ một mảng: #include #include const int maxPoints = 512; class Point { public: //... void* operator new (size_t bytes); void operator delete (void *ptr, size_t bytes); private: int xVal, yVal; static union Block { int xy[2]; Block *next; } *blocks; // tro toi cac luu tru ranh static Block *freeList; // ds ranh cua cac khoi da lien ket static int used; // cac khoi duoc dung }; Tên kiểu size_t được định nghĩa trong stddef.h.. Toán tử new sẽ luôn trả về void*. Tham số của new là kích thước của khối được cấp phát (tính theo byte). Đối số tương ứng luôn được truyền một cách tự động tới trình biên dịch. Tham số đầu của toán tử delete là khối được xóa. Tham số hai (tùy chọn) là Chương 8: Tái định nghĩa 141
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Chương 8. Tái định nghĩa
24 p |
189 |
82
-
Lập trình C++ Chương 8: Tái định nghĩa
24 p |
218 |
56
-
Giáo trình C++/ Chương 8: Tái định nghĩa
24 p |
105 |
31
-
CHƯƠNG 8: TÁI ĐỊNH NGHĨA (OVERLOADING)
18 p |
254 |
29
-
Các kiểu dữ liệu tự định nghĩa
5 p |
178 |
28
-
Những chủ đề tiến bộ trong C# - Các ép kiểu do người dùng định nghĩa – Phần 1
12 p |
97 |
14
-
Chương 8 - Hàm bạn, định nghĩa phép toán cho lớp
17 p |
101 |
14
-
Kỹ thuật lập trình C/C++-Chương: Định nghĩa chồng hàm
21 p |
55 |
11
-
Bài giảng Lập trình hướng đối tượng - Chương 3: Định nghĩa phép toán
92 p |
42 |
11
-
Bài giảng Lập trình hướng đối tượng C++: Chương 8 - ĐH Cần Thơ
18 p |
36 |
10
-
Giáo trình C++_hàm bạn, định nghĩa phép toán cho lớp
17 p |
43 |
6
-
HƯỚNG DẪN 9 CHƯƠNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG C: Tái định nghĩa_CHUONG 8
24 p |
28 |
4
-
Bài giảng Kỹ thuật lập trình: Chương 4 - Trần Quang Hải Bằng
4 p |
13 |
2
-
Bài giảng Lập trình hướng đối tượng: Operator và others - Trần Phước Tuấn
10 p |
11 |
2
-
Lập trình C - Chương 8: Tái định nghĩa
24 p |
41 |
2
-
Bài giảng Kỹ thuật lập trình: Chương 7 - Trần Quang Hải Bằng
3 p |
9 |
2
-
Bài giảng Lập trình hướng đối tượng: Định nghĩa phép toán Operator Overloading
96 p |
11 |
1

Server: Apache/2.2.31 (CentOS)

Set-Cookie: TLDEVNamespace=tie5mc2ujjas350cfm3u7hj127; path=/; domain=.tailieu.vn; HttpOnly


text:
Cà tím sốt thịt, rau tía tô
Chia sẻ: Kha Tu | Ngày: | Loại File: PDF | Số trang:2
207
lượt xem 21
download
lượt xem 21
download
Cà tím sốt thịt, rau tía tô
Mô tả tài liệu
Download Vui lòng tải xuống để xem tài liệu đầy đủ
Xếp cà tím nướng ra đĩa, rưới sốt thịt, thêm rau tía tô để nguyên lá hoặc thái sợi, rắc vừng rang vàng.
Chủ đề:
Bình luận(0) Đăng nhập để gửi bình luận!
CÓ THỂ BẠN MUỐN DOWNLOAD

markdown:
# Cà tím sốt thịt, rau tía tô
Chia sẻ: Kha Tu | Ngày: | Loại File: PDF | Số trang:2
207
lượt xem 21
download
lượt xem 21
download
![](http://image.tlvnimg.com/document/thumbnail/2009/20091127/womanhood911_11/80x100/ca_tim_sot_thit_rau_tia_to_5577.jpg)
##
Cà tím sốt thịt, rau tía tô
Mô tả tài liệu
[Vui lòng tải xuống để xem tài liệu đầy đủ](javascript:void(0);)
Download
![](http://static.tlvnimg.com/b2013az/templates/version1/default/images/down16x21.png)
Xếp cà tím nướng ra đĩa, rưới sốt thịt, thêm rau tía tô để nguyên lá hoặc thái sợi, rắc vừng rang vàng.
Chủ đề:
Bình luận(0)
[Đăng nhập để gửi bình luận!](javascript:void(0);)
CÓ THỂ BẠN MUỐN DOWNLOAD

Set-Cookie: TLDEVNamespace=ludg2d4q51ie2a9orvle08dtu0; path=/; domain=.tailieu.vn; HttpOnly


text:
Cách úp nụ, tuyển trái cho dưa hấu
Chia sẻ: Tran Anh Phuong | Ngày: | Loại File: DOC | Số trang:2
64
lượt xem 6
download
lượt xem 6
download
Cách úp nụ, tuyển trái cho dưa hấu
Mô tả tài liệu
Download Vui lòng tải xuống để xem tài liệu đầy đủ
Những năm gần đây dưa hấu đã trở thành loại cây màu được bà con nông dân trong huyện Vũng Liêm, tỉnh Vĩnh Long trồng nhiều vì những ưu điểm như chi phí tiêu tốn ít, thời gian trồng ngắn, ít có sâu bệnh, không chỉ cho năng suất cao mà còn đem lại lợi nhuận kinh tế cao gấp mấy lần trồng lúa
Chủ đề:
Bình luận(0) Đăng nhập để gửi bình luận!
CÓ THỂ BẠN MUỐN DOWNLOAD

markdown:
# Cách úp nụ, tuyển trái cho dưa hấu
Chia sẻ: Tran Anh Phuong | Ngày: | Loại File: DOC | Số trang:2
64
lượt xem 6
download
lượt xem 6
download
![](http://image.tlvnimg.com/document/thumbnail/2010/20100727/pretty3/80x100/cach_up_nu_tuyen_trai_cho_dua_hau_6935.jpg)
##
Cách úp nụ, tuyển trái cho dưa hấu
Mô tả tài liệu
[Vui lòng tải xuống để xem tài liệu đầy đủ](javascript:void(0);)
Download
![](http://static.tlvnimg.com/b2013az/templates/version1/default/images/down16x21.png)
Những năm gần đây dưa hấu đã trở thành loại cây màu được bà con nông dân trong huyện Vũng Liêm, tỉnh Vĩnh Long trồng nhiều vì những ưu điểm như chi phí tiêu tốn ít, thời gian trồng ngắn, ít có sâu bệnh, không chỉ cho năng suất cao mà còn đem lại lợi nhuận kinh tế cao gấp mấy lần trồng lúa
Chủ đề:
Bình luận(0)
[Đăng nhập để gửi bình luận!](javascript:void(0);)
CÓ THỂ BẠN MUỐN DOWNLOAD

Set-Cookie: TLDEVNamespace=ssdeckfbsbm6hj2mc10lg9qk65; path=/; domain=.tailieu.vn; HttpOnly


text:
Quyết định 185/QĐ-TTg
Chia sẻ: Trương Kiện | Ngày: | Loại File: PDF | Số trang:2
76
lượt xem 3
download
lượt xem 3
download
Quyết định 185/QĐ-TTg
Mô tả tài liệu
Download Vui lòng tải xuống để xem tài liệu đầy đủ
Quyết định 185/QĐ-TTg về việc phê duyệt Dự án "Tăng cường cung cấp thông tin khoa học, công nghệ cho thanh niên phục vụ phát triển kinh tế - xã hội các tỉnh biên giới, miền núi phía Bắc" do Thủ tướng Chính phủ ban hành
Chủ đề:
Bình luận(0) Đăng nhập để gửi bình luận!
CÓ THỂ BẠN MUỐN DOWNLOAD

markdown:
# Quyết định 185/QĐ-TTg
Chia sẻ: Trương Kiện | Ngày: | Loại File: PDF | Số trang:2
76
lượt xem 3
download
lượt xem 3
download
![](http://image1.tailieu.vn/document/thumbnail/2009/20091010/truongvekien/80x100/243.jpg)
##
Quyết định 185/QĐ-TTg
Mô tả tài liệu
[Vui lòng tải xuống để xem tài liệu đầy đủ](javascript:void(0);)
Download
![](http://static1.tailieu.vn/b2013az/templates/version1/default/images/down16x21.png)
Quyết định 185/QĐ-TTg về việc phê duyệt Dự án "Tăng cường cung cấp thông tin khoa học, công nghệ cho thanh niên phục vụ phát triển kinh tế - xã hội các tỉnh biên giới, miền núi phía Bắc" do Thủ tướng Chính phủ ban hành
Chủ đề:
Bình luận(0)
[Đăng nhập để gửi bình luận!](javascript:void(0);)
CÓ THỂ BẠN MUỐN DOWNLOAD

Set-Cookie: TLDEVNamespace=ugpqqlhujds48rek9b17d3nab0; path=/; domain=.tailieu.vn; HttpOnly