系统环境:Mac OS
IDE: XCode
概念:命名空间
关键字:namespace
没有用关键字时遇到的情况:
/*
程序员小德 定义了一个变量a 类型为int ,程序员小林 也定义了一个变量a 类型为BOOL, 因此当程序员小德和程序员小林的代码结合到一起的时候,就会造成一定的混乱
*/
int a = 1;
// ... other code
BOOL a = true;
使用关键字后:
namespace De{ //程序小德的变量声明
int flag = 1;
}
namespace Lin{ //程序小林的变量声明
bool flag = true;
}
- (void)viewDidLoad {
[super viewDidLoad];
De::flag = 0;
Lin::flag = YES;
}
使用using声明
// ::操作符 采用using声明
using De::flag;
flag = 0;
Lin::flag = YES;
使用using声明整个命名空间
namespace De{ //程序小德的变量声明
int flag = 1;
}
namespace Lin{ //程序小林的变量声明
bool flag = true;
}
using namespace Lin; // 可以用于声明整个命名空间
- (void)viewDidLoad {
[super viewDidLoad];
flag = 0;
De::flag = YES;
NSLog(@"%d",flag);
}
hello world
#include // 标准的C++头文件
using namespace std; // C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
@interface ViewController ()
@end
@implementation ViewController
namespace De{ //程序小德的变量声明
int flag = 1;
}
namespace Lin{ //程序小林的变量声明
bool flag = true;
}
using namespace Lin; // 可以用于声明整个命名空间
- (void)viewDidLoad {
[super viewDidLoad];
// ::操作符 采用using声明
flag = 0;
De::flag = YES;
cout << "hello world!" << endl; /*
hello world!
cout = c + out
<< C++标准库的Stream类重载了<<运算符,使之成为流的输出符号
endl 作用是换行
*/
}
概念:输入输出
常见的有 cin 、cout、cerr
/*需要特别强调的是cin、cout、cerr不是C++中的关键字,其本质是函数调用,
实现采用的是C++的运算符重载。
cout和cerr的输出目的地都是显示器,但不同的是cout是带有缓冲的,而cerr则不带缓冲。
在我们使用cout进行输出时需要紧接着使用“<<”操作符,
使用cin进行输入时需要紧接着使用“>>”操作符,
这两个操作符可以自行分析所处理的数据类型,无需我们像用scanf和printf那样设置输入输出格式化语句。*/
string str ;
cout << "hhg input some " << endl;
cin >> str;
cout << "result is=" << str << endl;
概念:引用(reference)
/*
引用是C++语言相对于C语言的又一个扩充,类似于指针,在声明的时候用&取代了*。
引用可以看做是被引用对象的一个别名
在声明引用时,必须同时对其进行初始化。
引用的声明方法如下:
类型标识符 &引用名 = 被引用对象
*/
int a = 1;
int &b = a;
cout << a << " = " << b << endl; // 打印值 1 = 1
cout << &a << " = " << &b << endl; // 打印地址 0x7fff50df3b8c = 0x7fff50df3b8c
b = 30;
cout << a << " = " << b << endl; // 打印值 30 = 30
概念 :函数
无返回值函数
void mySwap(int &a, int &b);
- (void)viewDidLoad {
[super viewDidLoad];
int numA = 233;
int numB = 333;
cout << numA << " " << numB << endl; // 233 333
mySwap(numA, numB); // 调用方法
cout << numA << " " << numB << endl; // 333 233
}
void mySwap(int &a , int &b) {
int temp = a;
a = b;
b = temp;
}
普通返回值的函数
int addMethod(int &a);
- (void)viewDidLoad {
[super viewDidLoad];
int numA = 233;
cout << numA << endl; // 233
addMethod(numA);
cout << numA << endl; // 238
}
int addMethod(int &a) {
a += 5;
return a;
}
引用返回值的函数
int & addMethod(int &a); // 多了 &
- (void)viewDidLoad {
[super viewDidLoad];
int numA = 233;
cout << numA << endl; // 233
int numB = addMethod(numA);
cout << numB << endl; // 238
}
int & addMethod(int &a) {
a += 5;
return a;
}
概念:强转
关键字: static_cast
// C语言强转
int a = 33;
int b = 454;
float c = (float)a /(float)b;
NSLog(@"%f",c); // 打印结果 0.072687
// C++ 强转 static_cast 形式: static_cast <类型说明符> (变量或表达式)
int d = 43;
int f = 45;
float g = static_cast(d) / static_cast(f);
NSLog(@"%f",g); // 打印结果 0.955556
关键字:const_cast
// C++ 强转 const_cast 形式:
/*
在C语言中,const限定符通常被用来限定变量,用于表示该变量的值不能被修改。
const_cast则是用于强制去掉这种不能被修改的常数特性,
需注意的是 const_cast 不是用于去除变量的常量性,
是去除指向常数对象的指针或引用的常量性
其去除常量性的对象必须为指针或引用。
*/
int a = 10;
const int *p = &a;
cout << " " << *p << endl; // *p = 10
int *q ;
q = const_cast(p);
*q = 20;
cout << *q << " " << *p << endl; // *q = 20 *p = 20
概念:内联
关键字:inline
// 通常在程序设计过程中,我们会将一些频繁被调用的短小函数声明为内联函数。
void swap(int &a ,int &b); // inline 关键字放函数处不齐作用,应放在函数体一起
inline void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
概念:分配、释放内存
关键字:new、new[]、delete、delete[]
/*
C 中 动态分配释放内存的函数是malloc calloc和free
C++中 动态分配释放内存的是new、new[]、delete、delete[]
*/
int *p = new int;
int *A = new int[10];
delete p;
delete []A;
概念:类
关键字:class
class student { // 类的声明 学生类
public: long studentID ; // 学生变量
};
- (void)viewDidLoad {
[super viewDidLoad];
student myLi; // 实例化
myLi.studentID = 234234;
cout << myLi.studentID <
概念:成员变量,成员函数
class student {
// 成员变量
char name[15]; // 姓名
int studentID ; // 学号
int age; // 年龄
char sex; // 性别
// 成员函数
public: void set_age(int a){age = a;}; // 类内部定义函数
int get_age(); // 外部定义函数, 也可以直接在该函数前加inline ,使之成为内联函数,也和类内部定义函数一样。
};
// 类外部定义函数
int student::get_age() {
return age;
}
- (void)viewDidLoad {
[super viewDidLoad];
student myLi ;
myLi.set_age(33);
cout << myLi.get_age() << endl;
}