1.C++ä¸ privateåpublicçåºå«ï¼
2.C# privateåprotectedåºå«
3.CMake的链接选项:PRIVATE,INTERFACE,PUBLIC
4.c ++ protected public private
C++ä¸ privateåpublicçåºå«ï¼
C++ä¸ privateåpublicçåºå«ï¼
privateåpublicçä½ç¨æ¯è®©ç¼è¯å¨å¸®ä½ æ£æ¥æäºæ¨¡ç»æ¯å¦ä½¿ç¨äºä»æ²¡è®¸å¯æ使ç¨ç模ç»ï¼ä¹å°±æ¯çæå¯æ§è¡ç¨å¼ç çæ¶åå许å¯ææ£æ¥ãæ¯å¦ï¼å ¬å¸éå个é¨é¨æèªå·±ç§æçèµè®¯ï¼è´¢å¡é¨å¯ä»¥çææå工工èµï¼èéå®é¨ä¸å¯ä»¥ï¼æ®éåå·¥ä¹ä¸å¯ä»¥ã
å¯ä¸å¯ä»¥è®¿é®é½æ¯è®¤ä¸ºè§å®çï¼èä¸å¨åç¨å¼ç çæ¶åç¨å¼æ¯ä¸ä¼æ§è¡çï¼å æ¤éè¦å¨çæç¨å¼ç çæ¶ååä¸äºæ£æ¥ï¼å°±åè¯æ³é误å¨ç¼è¯çæ¶å被æ£æ¥åºæ¥ä¸æ ·ï¼å 为人è§å®äºç¨å¼ç 该å¦ä½åã访é®æ§å¶ä¹æ¯å¨ç¼è¯çæ¶åæ£æ¥ï¼c++éç¨äºprivateï¼publicï¼protectedï¼ä»¥åfriendæ¥éå¶è®¿é®è®¸å¯æã
privateçæææ¯æç±»çå é¨åæ°æè å½å¼æ¯ç§æçï¼å¨ç±»ä¹å¤å æ¬ç»§æ¿ç±»å°±ä¸å¯è§ï¼åéæ¯å¸çéå ·ï¼publicæ¯æç±»çå é¨åæ°æ¯å¤é¨å¯è§çï¼åéæ¯å¸ç表æ¼ï¼protectedæ¯æé¤äºæ¬ç±»å继æ¿ç±»ä¹å¤ä¸å¯è§ï¼åéæ¯å¸å¸æå¾å¼ä½¿ç¨éå ·ï¼å°±å¾è®©å ¶å¾å¼çè§éå ·ï¼ä½æ¯æ¯ä¸ç§åä¿æ¤ç许å¯æï¼friendæ¯æç¹å®æåºåªäºç±»æè 模ç»å¯ä»¥çè§æ¬ç±»çç§æï¼private以åprotectedï¼æåï¼è¿å°±æ¯éæ¯å¸ä¿¡å¾è¿çæåå¯ä»¥è®©ä»çè§ä¸äºå¹åã
使ç¨å¥½è¿ä¸ªè§åï¼åªè¦ç¨å¼ä¸åºç°äºè¶æ访é®çç¨å¼ç ï¼ç¼è¯çæ¶åå°±ä¼è¢«æ£æ¥åºæ¥ï¼ä»¥ä¿è¯å®å ¨ã
举ä¾ï¼
class moshushiéæ¯å¸ç±»
{
friend class daoyan;导æ¼å¯ä»¥ç¥ééæ¯å¸èåçç§å¯
public:ææ人é½å¯ä»¥çè§çè¡ä¸ºä»¥åç©å
int jinchang();è¿åº
int biaoyan();表æ¼
int tuichang();éåº
int shou, yifu, maozi;æï¼è¡£æï¼å¸½å
protected:å¾å¼å¯ä»¥ç¥éç
int zhaotuo();æ¾ä¸ªæ
int gangsi;é¢ä¸
private:åªæèªå·±åfriendå¯ä»¥ç¥é
int zuobi();ä½å¼
int yaoshui, tezhizhuozi;è¯æ°´ï¼ç¹å¶æ¡å
};
class tudi: public moshushiéæ¯å¸å¾å¼
{
èªå¨æäºéæ¯å¸çpublic以åprotected
};
class daoyan导æ¼
{
int func(){
å¯ä»¥è®¿é®å°éæ¯å¸ç©ä»¶çç§æå
}
...
};
class guanzhongè§ä¼
{
ä¸è½è®¿é®éæ¯å¸ç©ä»¶çç§æå
...
};
æ±C++ç±»åå«Classä¸publicåprivateçåºå«public 表示èµææåï¼æåå½å¼å¯ä»¥è¢«å ¶å®ç±»æå类访é®
private表示åªæå½åç±»å é¨å¯ä»¥è®¿é®
C++ä¸publicãprivateåprotected访é®å±æ§çåºå«å¨æ¬ç±»ä¸ï¼protectedä¸privateæ¯ç¸åçï¼ä½protectedå¯ä»¥è¢«ç»§æ¿ï¼èprivateå´ä¸è¡ã åªæå ¬ææåæè½å¨ç±»çå¤é¨è®¿é®ãå¦class A{ private:int a;public:int b;protected:int c;};A ca;ca.a error ca.b ok ca.c error cb.c errorãè½ç¶cä¹æ¯Bçæåï¼ä½cå¨è¢«ç»§æ¿çæ¶ååæç§ææè åä¿æ¤çæåäºã
c++ç±»ä¸public,private,protectedçç¨æ³ä¸åºå«ãprotectedåå«ç访é®æºå¶ä¸privateä¸æ ·
å¨åºç±»çæ´¾çç±»ä¸,å¯ä»¥ç´æ¥è®¿é®ç»§æ¿èæ¥çprotectedæå,ä½æ¯ä¸è½è®¿é®privateéå¶çæå.æ以å¨æ´¾çç±»ä¸,å¯ä»¥è®¿é®åºç±»ç»§æ¿èæ¥çpublicåproected两ç§åå«çæå.
å¨publicå ¬ææ´¾çä¸,继æ¿èæ¥çæå访é®è®¸å¯æä¸å.protectedæ´¾çä¸,publicåprotectedé½åæprotected,privateæ´¾çä¸,ææç继æ¿ä¸æ¥é½æ¯privateäº
C++ä¸åå«å®ä¹ä¸çpublicä¸ privateçåºå«public,å¯ä»¥å¤¸å½å¼å¼å«ï¼èprivateï¼åªè½å±éäºåå½å¼å çå ¶ä»æåå¼å«ä¸ä½¿ç¨ã
javaä¸privateåpublicçåºå«
ä½ç¨å å½åç±» åä¸package ååç±» å ¶ä»package
public â â â â
private â Ã Ã Ã
å¨JAVAä¸ï¼publicåprivateçåºå«ï¼å ¬å ±åç§æï¼å ¬å ±çï¼åæ°ãæ¹æ³ï¼å¨è¿ä¸ªç±»å¤è¿è½å¼å«ï¼ç§æçåªè½å¨ç±»ï¼classï¼å é¨ä½¿ç¨ã
private åpublic çåºå«private åªè½æ¯èªå·±çç±»è®¿é® ã
1ãpublicï¼public表æ该èµææåãæåå½å¼æ¯å¯¹ææ使ç¨è å¼æ¾çï¼ææ使ç¨è é½å¯ä»¥ç´æ¥è¿è¡å¼å«
2ãprivateï¼private表示ç§æï¼ç§æçææå°±æ¯é¤äºclassèªå·±ä¹å¤ï¼ä»»ä½äººé½ä¸å¯ä»¥ç´æ¥ä½¿ç¨ï¼ç§æ财产ç¥å£ä¸å¯ä¾µç¯åï¼å³ä¾¿æ¯å女ï¼æåï¼é½ä¸å¯ä»¥ä½¿ç¨ã
publicåprivateçåºå«privateï¼æ è¯åªæå¨å½åç©ä»¶å¯ä»¥ç¨ï¼public表示å¤é¢ä¹å¯ä»¥ç¨
ä¾å¦ï¼
public class Userï¼ï¼{
private userId;
public username;
}
User u = new Userï¼ï¼ï¼
è¿æ¶ä½ åªè½è®¿é®u.username.privateçuserIdæ¯ä¸è½è¢«è®¿é®ç
C# privateåprotectedåºå«
privateåªæå é¨å¯ä»¥çå°ï¼å¹¶ä¸åªè½å é¨è°ç¨ã
èProtectedè½ç¶å¯ä»¥è¢«å¤ççå°ï¼ä½å¤çå´ä¸è½è°ç¨ã
æåé¢ææï¼åè æ¯æç§æçï¼å¨å£è¢éæ¾çï¼æ¯å¦è¯´ä¸é¢å¾å¤§çé»ç³ï¼ç §èäºä¸å½ç¶å¾å±é©ï¼åè æ¯åä¿æ¤çï¼è½ç¶ä½ çè§ææéæ¿ç个ææºï¼ä½ å´ä¸æ¢æ¢å»ç¨ãå 为é£æ¶ä¸åçæ³çï¼å¹¶ä¸è¢«çå°äºä¹æ²¡ä»ä¹ã
å·®ä¸å¤å°±è¿ä¸ªææäºã
éæ©ç¨é£ä¸ªï¼ä½ å°±ççè¿ä¸ªä¸è¥¿æ¯é»ç³è¿æ¯ææºã
CMake的链接选项:PRIVATE,INTERFACE,PUBLIC
为了验证这三种链接选项的作用,做了一个小实验。linux swap 源码在实验中,我们构建了项目结构如下:
其中,cmake-build-release是构建目录。
实验的代码部分,设置CMAKE_SKIP_RPATH TRUE以避免在动态库中写入RUNPATH项,具体作用可查阅相关文档。
在实验中,bar和foo两个库的依赖关系可以根据选择的链接选项进行不同设置:bar.cpp是否引用foo定义的符号,以及foo.h头文件在bar.h中的源码导读包含位置。实验设定保持其他部分代码不变,如foo.cpp包含foo.h,bar.cpp包含bar.h,app.cpp包含bar.h。
在实际项目中,bar作为库,依赖于现有的ecat源码foo库,提供接口给客户,客户则使用app,此时选择的bar链接方式会影响到app的编写。
实验的编译和运行阶段,需要设置LD_LIBRARY_PATH环境变量。
官方对链接选项的解释较为晦涩,但在StackOverflow上找到了一个清晰的reflect源码解释:PRIVATE表示bar.h不包含foo.h,只有bar.cpp包含了foo.h,因此app无法访问foo定义的符号。INTERFACE表示bar.h包含了foo.h,但bar.cpp未使用foo定义的符号,此时app可以引用foo的符号,bar作为接口传递给app。PUBLIC则表示bar.h包含了foo.h,cmsapi源码且bar.cpp使用了foo的符号,app同样可以引用foo的符号。
在实验中,通过更改CMakeLists.txt中的链接选项,并调整源码,得到了实验结果。使用make VERBOSE=1查看CMake生成的详细编译命令。
实验结果展示了使用PRIVATE、INTERFACE和PUBLIC链接选项时编译命令的差异,以及生成的libbar.so和app文件在链接关系上的表现。通过实验,可以发现,CMake在生成编译命令时,会应用库之间的依赖关系,但仅在文件生成时体现,实际文件中并无体现链接选项的标记。
实验还验证了,如果有一个现成的libbar.so,导入到CMake中作为library target,默认链接关系类似于PRIVATE。若app引用了foo的符号,可以通过CMake命令添加参数来显式链接到foo库。
实验还揭示了在共享库编译中,不一定需要解析所有符号,仅在最终编译可执行文件时解析所有符号即可。但这种方法可能导致问题,因为如果共享库引用了其他库的未定义符号,需要确保在编译共享库时解析这些依赖,并将依赖信息写入ELF头中。
c ++ protected public private
1.Cç±»ä¸ä¼æåç¬çå¯æ¬ï¼å°±æ¯ç¨ç¶ç±»çï¼å½ç¶å¦æä¹ç±»äº§ç对象ï¼ç¶ç±»çæåé½ä¼è¢«åé å åçã
2.åç±»çthisæéæ¯å¯ä»¥è®¿é®å°ç¶ç±»çæåçï¼ç¶ç±»çprivateå½ç¶ä¸è¡ã
ä½ å¯¹è¿ä¸ªå¾æå ´è¶£çè¯ï¼æ¨èä½ ä¸æ¬ä¹¦ã深度æ¢ç´¢C++对象模åã