2017-01-01 18 views
10

Đây là mãToán tử chèn không tạo ra kết quả mong đợi?

#include<iostream> 
using namespace std; 
main() 
{ 
    cout<<"Hellow World"<<endl; 
    cout.operator<<("Hellow World"); 
    cout.operator<<(endl); 
} 

Tôi biết rằng cout<<"Hellow World"<<endl; được hiểu như là cout.operator<<("Hellow World"); Nhưng mã này được sản xuất kết quả như sau

Hellow World

0x8048830

nếu tôi sử dụng operator<<(cout,"Hellow World"); công trình phạt những gì tôi Sự khác nhau giữa cout.operator<<("Hellow World");operator<<(cout,"Hellow World");

+4

Giả định trong đoạn đầu tiên của bạn không chính xác. Đừng cho rằng toán tử là thành viên của lớp – Caleth

+1

[không sử dụng 'endl' trừ khi bạn biết và thực sự cần hành vi của nó] (http://stackoverflow.com/q/213907/995714) –

Trả lời

15

std::basic_ostream quá tải operator<< trong hai nhóm, membersnon-members.

Sự khác biệt là do thực tế khi bạn viết cout<<"Hellow World"<<endl; quá tải không thành viên của const char* được chọn để in chuỗi ký tự.

Khi bạn gọi phiên bản thành viên, mức phù hợp nhất chỉ là quá tải void*.

+0

' 0x8048830' là giá trị không xác định này hoặc nó là cái gì đó liên quan đến một con trỏ void – Anjaneyulu

+0

'cout.operator << ((char *)" Hellow World ");' thậm chí điều này tạo ra cùng một kết quả '0x8048830' – Anjaneyulu

+2

@Anjaneyulu - Đó là địa chỉ của chuỗi chữ. Và đúc thành 'char *' sẽ không tạo ra sự khác biệt. Bạn lấy 'const char *' quá tải ra khỏi bức ảnh ngay khi bạn gọi trực tiếp thành viên quá tải. – StoryTeller

9

sự khác biệt giữa cout.operator<<("Hellow World");operator<<(cout, "Hellow World");

Khi bạn viết cout.operator<<("Hellow World"); bạn đang gọi phương thức operator<< và đi qua một const char *. Vì phương pháp này không bị quá tải để lấy số const char *, nhưng bị quá tải để lấy số const void *, đó là phương thức bạn gọi và nhận 0x8048830 (là địa chỉ của ký tự 'H' trong chuỗi của bạn).

Khi bạn viết operator<<(cout, "Hellow World"), bạn đang gọi một hàm miễn phí operator<< lấy luồng đầu ra ở bên trái và const char * ở phía bên tay phải. Có xảy ra để tồn tại một hàm như vậy, và nó có miêu tả sau (giản thể):

std::ostream& operator<<(std::ostream& os, const char *s); 

Và như vậy bạn được in chuỗi các ký tự bắt đầu tại s, và kết thúc tại '\0' đầu tiên được gặp (để bạn có được Hellow, world).

Cuối cùng, khi bạn viết std::cout << "Hello, world" << std::endl;, vì bạn đang chuyển một số const char * đến operator<<, chức năng miễn phí, là đối sánh hoàn hảo, được chọn theo phương pháp operator<<.

Các vấn đề liên quan