自学网站:C语言中文网
链接:C++入门教程http://c.biancheng.net/cplus/
一、从C到C++
1.2 C++类和对象到底是什么意思?—— 2021/10/11
C++ 中的类也是一种构造类型,但是进行了一些扩展,类的成员不但可以是变量,还可以是函数;通过类定义出来的变量也有特定的称呼,叫做“对象”。
有个问题:
class Student{
public:
//类包含的变量
char *name;
int age;
float score;
//类包含的函数
void say(){
printf("%s的年龄是 %d,成绩是 %f\n", name, age, score);
}
};
其中 stu1.name = "小明";
那么为什么指针也就是一个地址的值可以是一个字符串呢?
原因:表面上 "小明" 是一个字符串,实际上存的是一个这么长的字符串的的一个首地址。
*类只是一张图纸,起到说明的作用,不占用内存空间;对象才是具体的零件,要有地方来存放,才会占用内存空间。
C++、Java、C#、PHP 等很多编程语言中都支持类。
面向对象编程在代码执行效率上绝对没有任何优势,它的主要目的是方便程序员组织和管理代码,快速梳理编程思路,带来编程思想上的革新。
1.3 如何编译和运行C++
1.4 C++命名空间 —— 2021/10/12
一个中大型软件往往由多名程序员共同开发,会使用大量的变量和函数,不可避免地会出现变量或函数的命名冲突。当所有人的代码都测试通过,没有问题时,将它们结合到一起就有可能会出现命名冲突。
两个人在两个文件中定义同样的名称的全局变量,那么就会出现重复命名的问题。(Redefinition)
//定义命名空间的方式
namespace name{
//variables, functions, classes
}
//name是该命名空间的名字,它里面可以包含变量、函数、类、typedef、#define 等,最后由{ }包围。
//举例
namespace Li{ //小李的变量定义
FILE fp = NULL;
}
namespace Han{ //小韩的变量定义
FILE fp = NULL
}
::是域解析操作符,也就是 a::b ,指的是 b 是在 a 的命名空间中的一个名字。
Li::fp = fopen("one.txt", "r"); //使用小李定义的变量 fp
Han::fp = fopen("two.txt", "rb+"); //使用小韩定义的变量 fp
除了直接使用域解析操作符,还可以采用 using 关键字声明
using Li::fp;
fp = fopen("one.txt", "r"); //使用小李定义的变量 fp
Han :: fp = fopen("two.txt", "rb+"); //使用小韩定义的变量 fp
如果命名空间 Li 中还定义了其他的变量,那么同样具有 fp 变量的效果。在 using 声明后,如果有未具体指定命名空间的变量产生了命名冲突,那么默认采用命名空间 Li 中的变量。
站在编译和链接的角度,代码中出现的变量名、函数名、类名等都是一种符号(Symbol)。有的符号可以指代一个内存位置,例如变量名、函数名;有的符号仅仅是一个新的名称,例如 typedef 定义的类型别名。
代码举例:
#include <stdio.h>
//将类定义在命名空间中
namespace Diy{
class Student{
public:
char *name;
int age;
float score;
public:
void say(){
printf("%s的年龄是 %d,成绩是 %f\n", name, age, score);
}
};
}
int main(){
Diy::Student stu1;
stu1.name = "小明";
stu1.age = 15;
stu1.score = 92.5f;
stu1.say();
return 0;
}