C++ 命名空间及引用
一, C 与 C++ 的关系
C++ 可以与 C 代码进行混编
C++ 是一个面向对象编程语言, C 语言是面向过程的编程语言
C++ 是对 C 的一个增强
二, C++ 命名空间
C++ 标准的命名空间为 std , 包含很多标准的定义
<< 为运算符重载
命名空间类似于 Java 中的包
命名空间可以先进行使用
:: 为访问修饰符
示例:
- #include <stdlib.h>
- #include <iostream>
- // 使用标准命名空间
- using namespace std;
- // 自定义命名空间
- namespace NSP_A{
- int a = 9;
- struct Teacher{
- char name[20];
- int age;
- };
- struct Student{
- char name[20];
- int age;
- };
- }
- void main(){
- //std::cout <<"this is c plus plus" << std::endl;
- cout << "this is c plus plus" << endl;
- cout << "访问自定义命名空间的属性 a:" << NSP_A::a << endl;
- // 使用命名空间中的结构体
- using NSP_A::Student;
- Student t;
- t.age = 19;
- cout << "学生的年龄为:" << t.age << endl;
- getchar();
- }
三, C++ 中的类
C++ 中的类中的属性共享权限访问修饰符
类的 } 后有分号;
- using namespace std;
- #define PI 3.14
- class MyCircle{
- // 属性
- private:
- double r;
- double s;
- public:
- double length;
- public:
- void setR(double r){
- this->r = r;
- }
- double getS(){
- return PI * r * r;
- }
- };
- void main(){
- MyCircle c1;
- c1.setR(4);
- cout <<"圆的面积:" << c1.getS() << endl;
- getchar();
- }
输出:
圆的面积: 50.24
四, C++ 中的结构体
C++ 中的结构体中有权限访问修饰符
结构体在 C++ 中使用时可以省略 struct
结构体不能被继承
- using namespace std;
- struct Teacher{
- // 属性
- public:
- char* name;
- int age;
- public:
- void say(){
- cout << "My name is" << this->name <<", I am" << this->age <<"years old." << endl;
- }
- };
- void main(){
- Teacher t1;
- strcpy(t1.name, "Jack");
- t1.age = 25;
- t1.say();
- getchar();
- }
五, C++ 中的数据类型
C++ 中有 bool 类型 , 大小为 1 字节
C++ 中的三目运算可以成为左值, 改变复合条件的属性的值
- using namespace std;
- void main(){
- //bool isSingle = true;
- bool isSingle = -1;
- if(isSingle){
- cout << "单身" << endl;
- }else{
- cout << "有对象" << endl;
- }
- int a = 10, b = 20;
- int c = (a> b) ? a : b;
- cout <<"最大的数为" << ((a> b) ? a : b) <<endl;
- // 三目运算可以成为左值
- (a> b) ? a : b = 30;
- cout <<"b 的值为" << b << endl;
- getchar();
- }
六, C++ 中的引用
1, 引用的定义
C++ 中的引用就是在声明的变量名称前加 & 符号, 是为变量取别名, 作为函数参数传递, 能保证参数传递过程中不产生副本
引用必须要有值, 不能为 NULL
引用可以直接操作变量, 指针要通过取值 (p), 间接操作变量, 指针的可读性差 *
- using namespace std;
- void main(){
- int a = 10;
- //b 就是 a 的内存空间的另一个别名
- int &b = a;
- cout << b << endl;
- getchar();
- }
2,C++ 中的引用的作用
在 C++ 代码中使用引用比使用指针写起来更加方便
- using namespace std;
- // 通过指针进行值交换
- void swap_1(int *a, int *b){
- int c = 0;
- c = *a;
- *a = *b;
- *b = c;
- }
- // 通过引用进行值交换
- void swap_2(int &a, int &b){
- int c = 0;
- c = a;
- a = b;
- b = c;
- }
- void main(){
- int x = 30;
- int y = 50;
- swap_1(&x, &y);
- cout << "指针交换: x 的值为:"<< x << ",y 的值为" << y << endl;
- swap_2(x,y);
- cout << "引用交换: x 的值为:"<< x << ",y 的值为" << y << endl;
- getchar();
- }
3,C++ 中引用的主要功能
在 C++ 中, 引用的主要功能是作为函数的参数或返回值
- using namespace std;
- struct Teacher{
- const char* name;
- int age
- };
- void myprint(Teacher &t){
- cout << "姓名:" << t.name << ", 年龄:" << t.age << endl;
- }
- void main(){
- Teacher t;
- t.name = "jsaon";
- t.age = 29;
- myprint(t);
- getchar();
- }
在 C++ 中, 对指针的引用可以代替二级指针
- using namespace std;
- struct Teacher{
- const char* name;
- int age
- };
- void getTeacher(Teacher **p){
- Teacher *tmp = (Teacher*)malloc(sizeof(Teacher));
- tmp->age = 20;
- *p = tmp;
- }
- // 指针的引用, 代替二级指针
- void getTeacher(Teacher* &p){
- p = (Teacher*)malloc(sizeof(Teacher));
- p->age = 20;
- }
- void main(){
- Teacher *t = NULL;
- getTeacher(&t);
- getchar();
- }
4, 指针常量和常量指针
指针常量就是指针的常量, 不改变地址的指针, 但是可以修改它指向的内容
- void main(){
- int a = 2, b = 3;
- int *const p1 = &a;
- //p1 = &b; // 失败的, 不能改变地址
- *p1 = 4; // 可以改变 a 的值
- getchar();
- }
常量指针就是指向常量的指针, 不能修改内容, 可以修改地址
- void main(){
- int a = 2, b = 3;
- const int *p2 = &a;
- p1 = &b; // 可以改变地址
- //*p2 = 9; // 不可以改变 a 的值
- getchar();
- }
5, 常引用
常引用类似于 Java 中的 final, 值不可修改
- void main(){
- int a = 10,b = 9;
- const int &c = a;
- //c = b; // 不能再次赋值
- const int &d = 66;
- }
七, C++ 中的函数
1, 函数参数的默认值
在 C++ 中, 可以对函数的参数设置默认值
有默认值的参数必须在无默认值参数的最后
- using namespace std;
- int add(int x, int y = 13, int z = 20) {
- return (x + y + z);
- }
- void main() {
- int x = 17;
- int sum = add(10);
- cout <<"x+y+z=" << sum << endl;
- getchar();
- }
2, 函数的可变参数
在 C++ 中, 针对函数参数不确定的情况下, 可使用可变参数
- #include <stdarg.h>
- using namespace std;
- void func(int i,...){
- // 可变参数指针
- va_list args_p;
- // 开始读取可变参数, i 是最后一个固定参数
- va_start(args_p,i);
- int a = va_arg(args_p,int);
- int b = va_arg(args_p,int);
- char c = va_arg(args_p,char);
- cout <<a << endl;
- cout << b << endl;
- cout << c << endl;
- // 结束
- va_end(args_p);
- }
- void main() {
- func(9,10,32,'C');
- getchar();
- }
3, 函数的可变参数 (循环读取)
在 C++ 中, 针对函数参数不确定的情况下, 可使用可变参数
可变参数在循环遍历时, 不能获取个数, 只能通过约定来确定可变参数个数; 如第一个值来表示可变参数个数
- #include <stdarg.h>
- using namespace std;
- void func(int count, ...) {
- // 可变参数指针
- va_list args_p;
- // 开始读取可变参数, i 是最后一个固定参数
- va_start(args_p, count);
- char value;
- int i = 0;
- for (;i < count; i++) {
- value = va_arg(args_p, char);
- cout << value << endl;
- }
- // 结束
- va_end(args_p);
- }
- void main() {
- func(3, 'a', 'b', 'C');
- getchar();
- }
来源: http://www.jianshu.com/p/4095a87ab9b8