โดยค่าเริ่มต้นใช้ฟังก์ชั่น namespaced
คลาสจะสร้างวัตถุไม่ใช่เพื่อแทนที่เนมสเปซ
ในรหัสเชิงวัตถุ
Scott Meyers เขียนรายการทั้งหมดสำหรับหนังสือ Effective C ++ ของเขาในหัวข้อนี้ "ชอบฟังก์ชั่นที่ไม่ใช่สมาชิกที่ไม่ใช่สมาชิกในฟังก์ชั่นสมาชิก" ฉันพบการอ้างอิงออนไลน์กับหลักการนี้ในบทความจาก Herb Sutter:http://www.gotw.ca/gotw/084.htm
สิ่งสำคัญที่ควรทราบคือ: ในฟังก์ชั่น C ++ ในเนมสเปซเดียวกันกับคลาสที่อยู่ในอินเทอร์เฟซของคลาสนั้น (เนื่องจากADLจะค้นหาฟังก์ชันเหล่านั้นเมื่อแก้ไขการเรียกใช้ฟังก์ชัน)
ฟังก์ชั่น Namespaced เว้นแต่จะประกาศ "เพื่อน" ไม่มีการเข้าถึงภายในของชั้นเรียนในขณะที่วิธีการคงที่มี
ตัวอย่างเช่นนี่หมายความว่าเมื่อคุณรักษาชั้นเรียนของคุณหากคุณต้องการเปลี่ยนรูปแบบภายในของชั้นเรียนคุณจะต้องค้นหาผลข้างเคียงในวิธีการทั้งหมดรวมถึงแบบคงที่
ส่วนขยาย I
การเพิ่มโค้ดให้กับส่วนติดต่อของคลาส
ใน C # คุณสามารถเพิ่มวิธีการในชั้นเรียนแม้ว่าคุณจะไม่สามารถเข้าถึงได้ แต่ใน C ++ นี่เป็นไปไม่ได้
แต่ยังคงอยู่ใน C ++ คุณยังสามารถเพิ่มฟังก์ชันเนมสเปซได้แม้กระทั่งกับคลาสที่มีคนเขียนให้คุณ
ดูจากอีกด้านหนึ่งซึ่งเป็นสิ่งสำคัญเมื่อออกแบบรหัสของคุณเพราะเมื่อใส่ฟังก์ชั่นของคุณในเนมสเปซคุณจะอนุญาตให้ผู้ใช้เพิ่ม / ทำอินเทอร์เฟซของคลาสให้สมบูรณ์
ส่วนขยาย II
ผลข้างเคียงของจุดก่อนหน้าเป็นไปไม่ได้ที่จะประกาศวิธีคงที่ในหลายหัว ทุกวิธีจะต้องประกาศในคลาสเดียวกัน
สำหรับเนมสเปซฟังก์ชันจากเนมสเปซเดียวกันสามารถประกาศได้ในหลายหัว (ฟังก์ชั่นการแลกเปลี่ยนเกือบเป็นมาตรฐานเป็นตัวอย่างที่ดีที่สุด)
ส่วนขยาย III
coolness พื้นฐานของเนมสเปซคือในบางโค้ดคุณสามารถหลีกเลี่ยงการกล่าวถึงมันหากคุณใช้คำสำคัญ "using":
#include <string>
#include <vector>
// Etc.
{
using namespace std ;
// Now, everything from std is accessible without qualification
string s ; // Ok
vector v ; // Ok
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
และคุณสามารถ จำกัด "มลภาวะ" ให้เหลือหนึ่งคลาสด้วย:
#include <string>
#include <vector>
{
using std::string ;
string s ; // Ok
vector v ; // COMPILATION ERROR
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
"รูปแบบ" นี้จำเป็นสำหรับการใช้สำนวนแลกเปลี่ยนที่เกือบจะเป็นมาตรฐาน
และนี่เป็นไปไม่ได้ที่จะทำอย่างไรกับวิธีการคงที่ในชั้นเรียน
ดังนั้นเนมสเปซ C ++ จึงมีความหมายของตัวเอง
แต่มันจะไปไกลกว่านั้นเมื่อคุณสามารถรวม namespaces ในลักษณะที่คล้ายกับการสืบทอด
ตัวอย่างเช่นถ้าคุณมีเนมสเปซ A ที่มีฟังก์ชัน AAA, เนมสเปซ B ที่มีฟังก์ชั่น BBB คุณสามารถประกาศเนมสเปซ C และนำ AAA และ BBB ในเนมสเปซนี้โดยใช้คำหลัก
ข้อสรุป
เนมสเปซใช้สำหรับเนมสเปซ คลาสสำหรับคลาส
C ++ ได้รับการออกแบบเพื่อให้แต่ละแนวคิดมีความแตกต่างกันและมีการใช้แตกต่างกันในกรณีที่แตกต่างกันเพื่อแก้ปัญหาที่แตกต่างกัน
อย่าใช้คลาสเมื่อคุณต้องการเนมสเปซ
และในกรณีของคุณคุณต้องมีเนมสเปซ