Android NDK基础17:C++_命名空间_类_引用

C与C++的关系

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

命名空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdlib.h>
#include <iostream>

//标准命名空间(包含很多标准的定义)
using namespace std;
//命名空间类似于Java中包(归类)

//自定义命名空间
namespace NSP_A {
int a = 9;

struct Teacher t;
{
char name[20];
int age;
};

struct Student {
char name[20];
int age;
};
}

namespace NSP_B {
int a = 12;

//命名空间嵌套
namespace NSP_C {
int c = 90;
}
}

void main() {
printf("Hello World\n");
//运算符重载
//std::cout << "this is c plus plus" << std::endl;
cout << "this is c plus plus" << endl;
//使用命名空间
//::访问修饰符
cout << NSP_A::a << endl;
cout << NSP_B::a << endl;

cout << NSP_B::NSP_C::c << endl;

struct NSP_A::Teacher t;
t.age = 25;

//使用命名空间中的结构体
using NSP_A::Student;
Student s;
s.age = 10;

system("pause");
}

类和结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//类
#define PI 3.14

//圆
class MyCircle {
//属性(共用权限访问修饰符)
private:
double r;
double s;

public:
void setR(double r) {
this->r = r;
}

//获取面积
double getS() {
return PI * r * r;
}
};

void main() {
MyCircle c;
c.setR(4);

cout << "圆的面积:" << c.getS() << endl;

system("pause");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//结构体
struct MyTeacher {
public:
char name[20];
int age;
public:
void say() {
cout << this->age << "岁" << endl;
}
};

void main() {
MyTeacher t; //struct关键字可以省略
t.age = 10;
t.say();
system("pause");
}

布尔类型

C语言没有布尔类型,在C++中才有

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//布尔类型
void main() {
//bool isSingle = true;
bool isSingle = 17;
//false -17

if (isSingle) {
cout << "单身" << endl;
cout << sizeof(bool) << endl;
} else {
cout << "有对象" << endl;
}

int a = 10, b = 20;
((a > b) ? a : b) = 30; //三元运算符可以成为左值,这在C/Java中是不可行的
cout << b << endl;

system("pause");
}

引用

引用:内存空间地址的别名

1
2
3
4
5
6
7
8
9
10
void main() {
//变量名-门牌号(内存空间0x00001的别名,可不可以有多个名字?)
int a = 10;
//b就这个内存空间另外一个别名
//& C++中的引用
int &b = a;
cout << b << endl;

system("pause");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//指针值交换
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 = 10;
int y = 20;

printf("%d,%d\n", x, y);
//swap_1(&x, &y);
//a成了x的别名,b成了y的别名
swap_2(x, y);
printf("%d,%d\n", x, y);

system("pause");
}

引用的主要功能:作为函数的参数或返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//1.单纯给变量取别名没有任何意义,作为函数参数传递,能保证参数传递过程中不产生副本
//2.引用可以直接操作变量,指针要通过取值(*p),间接操作变量,指针的可读性差

struct Teacher {
char* name;
int age;
};

void print1(Teacher &t) {
cout << t.name << "," << t.age << endl;
t.age = 21;
}

void print2(Teacher *t) {
cout << t->name << "," << t->age << endl;
//(*t).name
}

//引用的主要功能:作为函数的参数或返回值
void main() {
Teacher t;
t.name = "Joe";
t.age = 20;

print1(t);
print2(&t);

system("pause");
}

指针的引用,代替二级指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//指针的引用,代替二级指针
struct Teacher {
char* name;
int age;
};

void getTeacher(Teacher **p) {
Teacher *tmp = (Teacher*) malloc(sizeof(Teacher));
tmp->age = 20;
*p = tmp;
}

//Teacher* &p = (Teacher **p)
void getTeacher(Teacher* &p) {
p = (Teacher*) malloc(sizeof(Teacher));
p->age = 20;
}

void main() {
Teacher *t = NULL;
getTeacher(&t);

system("pause");
}

指针常量与常量指针

1
2
3
4
5
6
7
8
9
10
11
12
void main() {
//指针常量,指针的常量,不改变地址的指针,但是可以修改它指向的内容
int a = 2, b = 3;
int const *p1 = &a;
//p1 = &b; //NO
*p1 = 4;

//常量指针,指向常量的指针,内容不能修改
const int *p2 = &a;
p2 = &b;
//*p2 = 9; //NO
}

常引用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
//常引用类似于java中final
void printf(const int &a) {
cout << a << endl;
}

void main() {
//const int a;
//引用必须要有值,不能为空
//int &a = NULL;

//常引用
int a = 10, b = 9;
const int &c = a;

//字面量
const int &d = 70;

//c = b;
printf(c);

system("pause");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
struct Teacher {
char name[20];
int age;
};

void print1(Teacher *t) {
if (t != NULL) {
cout << t->name << "," << t->age << endl;
}
}

void print2(Teacher &t) {
cout << t.name << "," << t.age << endl;
t.age = 21;
}

void main() {
Teacher t;

Teacher *p = NULL;
//报错,防止不报错,进行非空判断
print1(p);

//引用不能为空,没法传进去
Teacher &t = NULL;
print2(t);

system("pause");
}

引用的大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct Teacher {
char name[20];
int age;
};

void main() {
Teacher t;

Teacher &t1 = t;
Teacher *p = &t;

cout << sizeof(t1) << endl; //24
cout << sizeof(p) << endl; //4
system("pause");
}

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :