C++命名空间及引用

一、C 与 C++ 的关系

  1. C++ 可以与 C 代码进行混编
  2. C++ 是一个面向对象编程语言、C 语言是面向过程的编程语言
  3. C++ 是对 C 的一个增强

二、C++ 命名空间

  1. C++ 标准的命名空间为 std ,包含很多标准的定义
  2. << 为运算符重载
  3. 命名空间类似于Java中的包
  4. 命名空间可以先进行使用
  5. :: 为访问修饰符

示例:

#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();
}