打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C/C++程序结构

1.  C++程序的基本结构

先引入一个例子:

  1. #include <stdio.h>

  2. class Person {
  3. private:
  4. char *name;
  5. int age;
  6. char *work;

  7. public:
  8. void setName(char*name);
  9. int setAge(intage);
  10. void printInfo(void);
  11. };

  12. void Person::setName(char *name)
  13. {
  14. this->name = name;
  15. }

  16. int Person::setAge(intage)
  17. {
  18. if (age < 0|| age > 150)
  19. {
  20. this->age= 0;
  21. return-1;
  22. }
  23. this->age = age;
  24. return 0;
  25. }

  26. void Person::printInfo(void)
  27. {
  28. printf("name = %s, age = %d, work = %s\n",name, age, work);
  29. }

  30. int main(intargc, char **argv)
  31. {
  32. Person per;

  33. //per.name = "zhangsan";
  34. per.setName("zhangsan");
  35. per.setAge(200);
  36. per.printInfo();

  37. return 0;
  38. }

在上面的代码里,函数的声明是在写在类里面的,实现在类外部。在实际开发中,使用者更关心的是对外提供的接口函数,而并不关心内部实现,所以上述的代码可以拆分成头文件和源文件,头文件代表对外提供的访问接口,源文件里编写具体实现。所以上述程序可以通过以下步骤修改:拆分成头文件,源文件和主程序,编写Makefile对源码进行编译。

头文件:

  1. #include <stdio.h>

  2. class Person {
  3. private:
  4. char *name;
  5. int age;
  6. char *work;

  7. public:
  8. void setName(char*name);
  9. int setAge(intage);
  10. void printInfo(void);
  11. };

源文件:

  1. #include <stdio.h>
  2. #include "person.h"

  3. void Person::setName(char *name)
  4. {
  5. this->name = name;
  6. }

  7. int Person::setAge(intage)
  8. {
  9. if (age <0|| age > 150)
  10. {
  11. this->age= 0;
  12. return-1;
  13. }
  14. this->age = age;
  15. return0;
  16. }

  17. void Person::printInfo(void)
  18. {
  19. printf("name =%s, age = %d, work = %s\n",name, age, work);
  20. }

主程序:

  1. #include <stdio.h>
  2. #include "person.h"

  3. int main(intargc,char **argv)
  4. {
  5. Person per;

  6. //per.name ="zhangsan";
  7. per.setName("zhangsan");
  8. per.setAge(200);
  9. per.printInfo();

  10. return0;
  11. }


Makefile:

  1. person: main.o person.o
  2. g++ -o$@$^

  3. %.o :%.cpp
  4. g++ -c -o$@$<

  5. clean:
  6. rm -f *.o person

2.  命名空间

C++命名空间可以避免在使用多方库时导致命名冲突,C++使用关键字namespace来标示各种标识符的作用域,由此解决不同作用域的标识符命名冲突问题。

dog.h

  1. namespace C {

  2. class Dog {
  3. private:
  4. char *name;
  5. int age;
  6. public:
  7. void setName(char*name);
  8. int setAge(intage);
  9. void printInfo(void);
  10. };

  11. void printVersion(void);

  12. }

dog.cpp

  1. #include <stdio.h>
  2. #include "dog.h"

  3. namespace C {

  4. void Dog::setName(char*name)
  5. {
  6. this->name = name;
  7. }

  8. int Dog::setAge(intage)
  9. {
  10. if (age <0|| age > 20)
  11. {
  12. this->age= 0;
  13. return-1;
  14. }
  15. this->age = age;
  16. return0;
  17. }

  18. void Dog::printInfo(void)
  19. {
  20. printf("name =%s, age = %d\n",name, age);
  21. }

  22. void printVersion(void)
  23. {
  24. printf("Dog v1, by weidongshan\n");
  25. }

  26. }

person.h

  1. #include <stdio.h>

  2. namespace A {

  3. class Person {
  4. private:
  5. char *name;
  6. int age;
  7. char *work;

  8. public:
  9. void setName(char*name);
  10. int setAge(intage);
  11. void printInfo(void);
  12. };

  13. void printVersion(void);
  14. }


person.cpp

  1. #include <stdio.h>
  2. #include "person.h"

  3. namespace A {

  4. void Person::setName(char *name)
  5. {
  6. this->name = name;
  7. }

  8. int Person::setAge(intage)
  9. {
  10. if (age <0|| age > 150)
  11. {
  12. this->age= 0;
  13. return-1;
  14. }
  15. this->age = age;
  16. return0;
  17. }

  18. void Person::printInfo(void)
  19. {
  20. printf("name =%s, age = %d, work = %s\n",name, age, work);
  21. }

  22. void printVersion(void)
  23. {
  24. printf("Person v1, by weidongshan\n");
  25. }

  26. }

main.cpp

  1. #include <stdio.h>
  2. #include "person.h"
  3. #include "dog.h"

  4. int main(intargc,char **argv)
  5. {
  6. A::Person per;
  7. per.setName("zhangsan");
  8. per.setAge(16);
  9. per.printInfo();

  10. C::Dog dog;
  11. dog.setName("wangcai");
  12. dog.setAge(1);
  13. dog.printInfo();

  14. A::printVersion();
  15. C::printVersion();
  16. return0;
  17. }

C++命名空间包含了全局命名空间和局部命名空间,全局命名空间写在函数外部,一般在文件开始的地方,在此处使用命名空间全局有效。局部命名空间一般写在函数体内部,在该函数体作用域内有效。

例如:

  1. #include <stdio.h>
  2. #include "person.h"
  3. #include "dog.h"

  4. /* global namespace */

  5. /* 把A::Person放入global namespace, 以后可以使用Person来表示A::Person */
  6. using A::Person;

  7. /* 把C::Dog放入global namespace, 以后可以使用Dog来表示C::Dog */
  8. using C::Dog;

  9. using A::printVersion;
  10. using C::printVersion;

  11. int main(int argc, char **argv)
  12. {
  13. /* local namespace */
  14. //using A::Person;
  15. //using C::Dog;

  16. Person per;
  17. per.setName("zhangsan");
  18. per.setAge(16);
  19. per.printInfo();

  20. Dog dog;
  21. dog.setName("wangcai");
  22. dog.setAge(1);
  23. dog.printInfo();

  24. A::printVersion();
  25. C::printVersion();
  26. return 0;
  27. }

还可以直接使用usingnamespace把命名空间全部导入

  1. #include <stdio.h>
  2. #include "person.h"
  3. #include "dog.h"

  4. using namespace A;
  5. using namespace C;

  6. int main(int argc, char **argv)
  7. {
  8. /* local namespace */
  9. //using A::Person;
  10. //using C::Dog;

  11. Person per;
  12. per.setName("zhangsan");
  13. per.setAge(16);
  14. per.printInfo();

  15. Dog dog;
  16. dog.setName("wangcai");
  17. dog.setAge(1);
  18. dog.printInfo();

  19. A::printVersion();
  20. C::printVersion();
  21. return 0;
  22. }

3.  输入输出流

C++使用使用iostream实现输入输出

  1. #include <iostream>
  2. #include "dog.h"

  3. namespace C {

  4. usingnamespacestd;

  5. void Dog::setName(char*name)
  6. {
  7. this->name = name;
  8. }

  9. int Dog::setAge(intage)
  10. {
  11. if (age <0|| age > 20)
  12. {
  13. this->age= 0;
  14. return-1;
  15. }
  16. this->age = age;
  17. return0;
  18. }

  19. void Dog::printInfo(void)
  20. {
  21. cout<<"name = "<<name<<" age = "<<age<<endl;
  22. }

  23. void printVersion(void)
  24. {
  25. cout<<"Dog v1, by weidongshan"<<endl;
  26. }

  27. }

4.  总结

1.      C++程序基本结构分为头文件,源文件和主程序

2.      #include<>查找头文件时去系统目录查找#include”” 查找头文件优先从程序目录中寻找,如果查找不到再到系统目录中寻找

3.      如果出现函数重名,使用命名空间进行区分

4.      全局命名空间全局有效,局部命名空间局部有效

5.      调用者只用命名命名空间函数的方式:

  (1)直接调用 a::fun

  (2)using a::fun;一个一个导入

  (3)using namespace a;全部导入

6.      使用iostream输入输出

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C++ this指针详解
this关键字的陈述与应用
泛型与反射
Java中static、this、super、final用法简谈(二)
java clone - ttitfly的笔记 - JavaEye技术网站
Java序列化机制要序列化那些内容
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服