先引入一个例子:
- #include <stdio.h>
- class Person {
- private:
- char *name;
- int age;
- char *work;
- public:
- void setName(char*name);
- int setAge(intage);
- void printInfo(void);
- };
- void Person::setName(char *name)
- {
- this->name = name;
- }
- int Person::setAge(intage)
- {
- if (age < 0|| age > 150)
- {
- this->age= 0;
- return-1;
- }
- this->age = age;
- return 0;
- }
- void Person::printInfo(void)
- {
- printf("name = %s, age = %d, work = %s\n",name, age, work);
- }
- int main(intargc, char **argv)
- {
- Person per;
- //per.name = "zhangsan";
- per.setName("zhangsan");
- per.setAge(200);
- per.printInfo();
- return 0;
- }
在上面的代码里,函数的声明是在写在类里面的,实现在类外部。在实际开发中,使用者更关心的是对外提供的接口函数,而并不关心内部实现,所以上述的代码可以拆分成头文件和源文件,头文件代表对外提供的访问接口,源文件里编写具体实现。所以上述程序可以通过以下步骤修改:拆分成头文件,源文件和主程序,编写Makefile对源码进行编译。
头文件:
- #include <stdio.h>
- class Person {
- private:
- char *name;
- int age;
- char *work;
- public:
- void setName(char*name);
- int setAge(intage);
- void printInfo(void);
- };
源文件:
- #include <stdio.h>
- #include "person.h"
- void Person::setName(char *name)
- {
- this->name = name;
- }
- int Person::setAge(intage)
- {
- if (age <0|| age > 150)
- {
- this->age= 0;
- return-1;
- }
- this->age = age;
- return0;
- }
- void Person::printInfo(void)
- {
- printf("name =%s, age = %d, work = %s\n",name, age, work);
- }
主程序:
- #include <stdio.h>
- #include "person.h"
- int main(intargc,char **argv)
- {
- Person per;
- //per.name ="zhangsan";
- per.setName("zhangsan");
- per.setAge(200);
- per.printInfo();
- return0;
- }
Makefile:
- person: main.o person.o
- g++ -o$@$^
- %.o :%.cpp
- g++ -c -o$@$<
- clean:
- rm -f *.o person
C++命名空间可以避免在使用多方库时导致命名冲突,C++使用关键字namespace来标示各种标识符的作用域,由此解决不同作用域的标识符命名冲突问题。
dog.h
- namespace C {
- class Dog {
- private:
- char *name;
- int age;
- public:
- void setName(char*name);
- int setAge(intage);
- void printInfo(void);
- };
- void printVersion(void);
- }
dog.cpp
- #include <stdio.h>
- #include "dog.h"
- namespace C {
- void Dog::setName(char*name)
- {
- this->name = name;
- }
- int Dog::setAge(intage)
- {
- if (age <0|| age > 20)
- {
- this->age= 0;
- return-1;
- }
- this->age = age;
- return0;
- }
- void Dog::printInfo(void)
- {
- printf("name =%s, age = %d\n",name, age);
- }
- void printVersion(void)
- {
- printf("Dog v1, by weidongshan\n");
- }
- }
person.h
- #include <stdio.h>
- namespace A {
- class Person {
- private:
- char *name;
- int age;
- char *work;
- public:
- void setName(char*name);
- int setAge(intage);
- void printInfo(void);
- };
- void printVersion(void);
- }
person.cpp
- #include <stdio.h>
- #include "person.h"
- namespace A {
- void Person::setName(char *name)
- {
- this->name = name;
- }
- int Person::setAge(intage)
- {
- if (age <0|| age > 150)
- {
- this->age= 0;
- return-1;
- }
- this->age = age;
- return0;
- }
- void Person::printInfo(void)
- {
- printf("name =%s, age = %d, work = %s\n",name, age, work);
- }
- void printVersion(void)
- {
- printf("Person v1, by weidongshan\n");
- }
- }
main.cpp
- #include <stdio.h>
- #include "person.h"
- #include "dog.h"
- int main(intargc,char **argv)
- {
- A::Person per;
- per.setName("zhangsan");
- per.setAge(16);
- per.printInfo();
- C::Dog dog;
- dog.setName("wangcai");
- dog.setAge(1);
- dog.printInfo();
- A::printVersion();
- C::printVersion();
- return0;
- }
C++命名空间包含了全局命名空间和局部命名空间,全局命名空间写在函数外部,一般在文件开始的地方,在此处使用命名空间全局有效。局部命名空间一般写在函数体内部,在该函数体作用域内有效。
例如:
- #include <stdio.h>
- #include "person.h"
- #include "dog.h"
- /* global namespace */
- /* 把A::Person放入global namespace, 以后可以使用Person来表示A::Person */
- using A::Person;
- /* 把C::Dog放入global namespace, 以后可以使用Dog来表示C::Dog */
- using C::Dog;
- using A::printVersion;
- using C::printVersion;
- int main(int argc, char **argv)
- {
- /* local namespace */
- //using A::Person;
- //using C::Dog;
- Person per;
- per.setName("zhangsan");
- per.setAge(16);
- per.printInfo();
- Dog dog;
- dog.setName("wangcai");
- dog.setAge(1);
- dog.printInfo();
- A::printVersion();
- C::printVersion();
- return 0;
- }
还可以直接使用usingnamespace把命名空间全部导入
- #include <stdio.h>
- #include "person.h"
- #include "dog.h"
- using namespace A;
- using namespace C;
- int main(int argc, char **argv)
- {
- /* local namespace */
- //using A::Person;
- //using C::Dog;
- Person per;
- per.setName("zhangsan");
- per.setAge(16);
- per.printInfo();
- Dog dog;
- dog.setName("wangcai");
- dog.setAge(1);
- dog.printInfo();
- A::printVersion();
- C::printVersion();
- return 0;
- }
C++使用使用iostream实现输入输出
- #include <iostream>
- #include "dog.h"
- namespace C {
- usingnamespacestd;
- void Dog::setName(char*name)
- {
- this->name = name;
- }
- int Dog::setAge(intage)
- {
- if (age <0|| age > 20)
- {
- this->age= 0;
- return-1;
- }
- this->age = age;
- return0;
- }
- void Dog::printInfo(void)
- {
- cout<<"name = "<<name<<" age = "<<age<<endl;
- }
- void printVersion(void)
- {
- cout<<"Dog v1, by weidongshan"<<endl;
- }
- }
1. C++程序基本结构分为头文件,源文件和主程序
2. #include<>查找头文件时去系统目录查找#include”” 查找头文件优先从程序目录中寻找,如果查找不到再到系统目录中寻找
3. 如果出现函数重名,使用命名空间进行区分
4. 全局命名空间全局有效,局部命名空间局部有效
5. 调用者只用命名命名空间函数的方式:
(1)直接调用 a::fun
(2)using a::fun;一个一个导入
(3)using namespace a;全部导入
6. 使用iostream输入输出
联系客服