c++ 学习之路 第一天 C++类和对象,命名空间,标准库和std命名空间
2016-07-20 16:52
876 查看
一.类和对象的概念
类 :C++中的类是一种用户定义的类型,可以理解为C语言中的结构体的升级版。对象 :C++中的类也是一种构造数据类型,但是进行了一些扩展,类的成员不但可以是变量,还可以是函数;通过类定义出来的变量就叫做对象。下面给出一段示例代码:
#include<stdio.h> int main(void){ class Student{ public: char *name; int age; float score; public: int printInfo(void){ printf("%s age is:%d,score is %f",name,age,score); } }; class Student stu1; stu1.name="kelvin"; stu1.age=20; stu1.score=100.0; stu1.printInfo(); return 1; }
这段代码中,class用于声明一个类,public表示该成员是共有的,“共有”是指这个类创建出的对象都可以访问该成员,与之相对就会有private,正与public相反。
C++中,通过类可以创建对象,类可以看做模板,通过模板可以生产出具有相同性质的产品,因此也将对象成为类的一个实例,这个过程称为类的实例化。
注意:类只是一个模板,起到指导的作用,不占用内存空间;对象才是具体的产品,要有地方来存放,才会占用内存空间。
类所包含的变量和函数也有了新的的称呼,变量被称为属性(通常也称成员变量),函数被称为方法;属性和方法统称为类的成员。
二.命名空间
C++语言引入命名空间(Namespace)这一概念主要是为了避免命名冲突,其关键字为namespace。一个较大的项目在开发过程中,会有很多人参与,不可避免地会出现变量,函数重名的情况。每个人的代码单独运行都没有问题,但合并在一起时就出现了问题,所以引入了namespace的概念。
//那么命名空间是如何解决问题的呢,我们来看这样一段code. int flag = 1; //A声明的变量 // …… //中间间隔若干行代码 bool flag = true; //B声明的变量
每个人习惯不同,有人喜欢用0,1做逻辑判断,有人喜欢用布尔值。于是我们用namespace来解决冲突的问题。
namespace A{ //A的变量声明 int flag = 1; } namespace B{ //B的变量声明 bool flag = true; }
A和B分别用姓名来指定各自的命名空间,这样两个flag变量再放进同一个函数体里就不会有冲突。当然得说明是哪个namespace里的flag。于是,为了说明变量属于哪个namespace,有了 域解析操作符 ::
A::flag = 0; //使用A定义的变量flag B::flag = false; //使用B定义的变量flag
除了直接使用域解析操作符,还可以使用 using 关键字
using A::flag; flag = 0; //使用A定义的变量flag B::flag = false; //使用B定义的变量flag
代码开头用using声明使用A定义的flag,表示之后的代码在未指定namespace时都使用A定义的flag,但要使用B定义的flag时,还是要用 :: 来指定namespace。
命名空间内部不仅可以声明或定义变量,对于其它能在命名空间以外声明或定义的实体,同样也都能在命名空间内部进行声明或定义,例如类的声明或定义、函数的声明或定义、typedef等都可以出现在命名空间中。
给出namespace示例代码如下:
#include<stdio.h> namespace kelvin{ class Student{ public: char *name; int age; float score; public: int printInfo(void){ printf("%s age is:%d,score is %f",name,age,score); } }; } int main(void){ using namespace kelvin; class Student stu1; stu1.name="kelvin"; stu1.age=20; stu1.score=100.0; stu1.printInfo(); return 1; }
三.C++标准库和std命名空间
使用C++标准头文件前面我们使用了C语言的格式输出函数 printf,引入了头文件 stdio.h,这完全没有错误,因为C++兼容C。但在C++代码中我还是推荐使用C++的头文件,不要把C和C++代码混合在一起使用。
如果你希望使用 printf 函数,那么应该引入 ,并使用命名空间 std,如下所示:
#include <cstdio> using namespace std;
通过两个函数和解析,命名空间就能理解清晰**
使用std这个名字空间。标准库里面的东西都是处于std名字空间的。
解析程序一:
#include <iostream> using namespace std; namespace class1{ int zhangsan=100; namespace group1{ int lisi =500; }; }; namespace class2{ int zhangsan=200; }; //命名空间就是一个作用域 //包括一个类、函数、语句块都是一个作用域,典型语法符号就是指{}; using namespace class1; using namespace class2; int zhangsan =300; int main() { cout<<"Hello world!"<<endl; //::,域访问符,指的是前面的作用域内取访问某些变量或符号 cout<<"class1::zhangsan="<<class1::zhangsan<<endl; cout<<"class2::zhangsan="<<class2::zhangsan& c142 lt;<endl; cout<<"::zhangsan="<<::zhangsan<<endl; cout<<"class1::group1::lisi="<<class1::group1::lisi<<endl; return 0; }
**using namespace std;
如果不写这句,
你写cin和cout时候就必须这样写,否则找不到cin或者cout。
std::cin>>a;
std::cout << a << std::endl;
//////////////
解析程序二:
#include <iostream> using namespace std; namespace class1{ int zhangsan=100; namespace group1{ int lisi =500; }; }; #if 0 namespace class2{ int zhangsan=200; }; #endif //命名空间就是一个作用域 //包括一个类、函数、语句块都是一个作用域,典型语法符号就是指{}; //using namespace class1; using namespace class1::group1; //int zhangsan =300; int main() { cout<<"Hello world!"<<endl; //::,域访问符,指的是前面的作用域内取访问某些变量或符号 // cout<<"zhangsan="<<zhangsan<<endl; cout<<"lisi="<<lisi<<endl; return 0; }
相关文章推荐
- Android Native 绘图方法
- Flex Namespace的用法
- C#中struct和class的区别详解
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- 深入了解PHP类Class的概念
- jquery 表单验证之通过 class验证表单不为空
- setAttribute 与 class冲突解决
- JavaScript通过HTML的class来获取HTML元素的方法总结
- JavaScript中的类(Class)详细介绍
- 原生js实现class的添加和删除简单代码
- javascript面向对象包装类Class封装类库剖析
- jQuery针对input的class属性写了多个值情况下的选择方法
- 详解js中class的多种函数封装方法
- jQuery使用hide方法隐藏指定元素class样式用法实例
- jQuery给多个不同元素添加class样式的方法
- jQuery点击改变class并toggle及toggleClass()方法定义用法
- jquery采用oop模式class类的使用示例
- jquery点击改变class并toggle的实现代码
- ajax使用不同namespace的action的方法