從iOS開(kāi)發(fā)者的角度去學(xué)習(xí)c++ (本文Demo在Xcode編譯器)
c++ 和 oc 都是c的超集 都有面向?qū)ο蟮恼Z(yǔ)言特性 對(duì)于熟悉oc的開(kāi)發(fā)者來(lái)說(shuō) 從iOS開(kāi)發(fā)者角度去嘗試?yán)斫夂椭珠_(kāi)始學(xué)習(xí)C++
OC和 C++ 的差異比較
-在OC中你可以運(yùn)用技術(shù)手段拿到所在類(lèi)的所有方式函數(shù)和屬性 無(wú)論.h文件中是否暴露你都可以利用method swizzling去修改或獲得 本質(zhì)是因?yàn)镺C實(shí)在運(yùn)行時(shí)確定
-而在C++中 由于在編譯時(shí)確定 所以對(duì)作用域外的函數(shù)或成員變量成員函數(shù)進(jìn)行操作
文件差異
OC 和 C++ 都包含 h(hpp)和m(cpp)
-OC中
//GLOCPerson.h 文件
#import <Foundation/Foundation.h>
@interface GLOCPerson : NSObject
@end
//GLOCPerson.m
#import "GLOCPerson.h"
@implementation GLOCPerson
@end
-C++中
//GLPerson.hpp
#ifndef GLPerson_hpp
#define GLPerson_hpp
#include <stdio.h>
#endif /* GLPerson_hpp */
//GLPerson.cpp
#include "GLPerson.hpp"
在C++中的實(shí)現(xiàn)文件中什么都沒(méi)有,不需要像OC那樣@implementation和@end來(lái)開(kāi)始和結(jié)束
在OC中我們導(dǎo)入頭文件通常#import xxx 這樣編譯器可以放置頭文件重復(fù)導(dǎo)入 而在C++中使用#include 頭文件是否重復(fù)導(dǎo)入需要開(kāi)發(fā)者自己檢查
成員變量和成員函數(shù)
對(duì)于成員變量我們可以在實(shí)現(xiàn)文件中定義(.m) 這樣對(duì)于外界而言相當(dāng)于私有成員變量(通過(guò)runtime手段獲得就另說(shuō)了)相當(dāng)于C++的private
如果在.h文件中定義的話相當(dāng)于任何其他的類(lèi)都能訪問(wèn) 相當(dāng)于C++的public
-OC中
#import "GLOCPerson.h"
@interface GLOCPerson ()
@property (nonatomic,strong)NSString*name;
@property (nonatomic,assign)NSInteger age;
@end
@implementation GLOCPerson
-(NSInteger)myAge:(NSInteger)age{
return 0;
}
@end
-C++中
#ifndef GLPerson_hpp
#define GLPerson_hpp
#include <stdio.h>
#include <string>
class GLPerson {
private:
std::string name;
int age;
public:
std::string name1;
int age1;
int myAge(int age);
};
#endif /* GLPerson_hpp */
需要注意的std::string name;是在OC中沒(méi)有重命名空間這個(gè)概念 在不同的類(lèi)中是允許相同的函數(shù)的
但在C++中為了解決命名沖突的事件會(huì)利用雙冒號(hào)來(lái)表示 看下面的
namespace MyNamespace {
class GLPerson { … };
}
namespace LibraryNamespace {
class GLPerson { … };
}
//MyNamespace:: GLPerson pOne;
//LibraryNamespace:: GLPerson pTwo;
這樣加上前綴區(qū)分了不同的類(lèi)
在oc調(diào)用函數(shù)以及方法
#import "ViewController.h"
#include "GLPerson.hpp"
#include <iostream>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
GLPerson cPlusPerson;
cPlusPerson.name1 = "123";
cPlusPerson.age1 = 12;
// NSLog(@"%@ %d",cPlusPerson.name1,cPlusPerson.age1);
std::cout<< "Lefe_x age is " << cPlusPerson.name1 << cPlusPerson.age1 << std::endl;
// Do any additional setup after loading the view.
}
需要注意的是oc和c++混編需要將.m修改為.mm
運(yùn)行工程看下打印信息

截屏2021-02-10 上午11.25.02.png