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