西安做门户网站最好的公司,工控软件界面设计,在哪个网站做流程图比较好看,对网站策划的看法1#xff1a;区分C中的术语声明、定义、初始化的概念声明#xff08;declaration#xff09;#xff1a;告诉编译器某个东西的名称和类型#xff0c;但略去其他细节#xff08;可以出现多次#xff0c;编译器不分配内存#xff09;。定义#xff08;definition#x…1区分C中的术语声明、定义、初始化的概念声明declaration告诉编译器某个东西的名称和类型但略去其他细节可以出现多次编译器不分配内存。定义definition提供编译器一些声明式所遗漏的细节编译器此时为对象分配内存注意内置类型和自定义类型定义的变量都叫做对象变量有且仅有一次定义。声明和定义1extern关键字区分2声明中出现初始化式当做定义即使出现extern关键字3带{ }的是定义其他的是声明引申头文件中不要放入变量定义容易导致重复定义错误可以使用static关键字把变量定义限制在源文件作用域内
头文件中一般不放实体定义但有三个例外const常量定义;类的定义inline函数如何区分声明和定义可以参考这篇文章https://blog.csdn.net/sjxbf/article/details/6310150初始化initialization给予对象初值的过程用户自定义函数对象初始化由构造函数执行default构造函数可以调用不带任何实参通常有两种情况情况1没有参数情况2每个参数都有缺省值
2explicit关键字用来阻止执行隐式类型转换但仍可以执行显示类型转换 explicit主要用于单个参数的类构造函数中如果出现多个参数explicit关键字失效除了一种情况例外就是除了第一个参数其他参数都有默认缺省值时explicit依然有效
3copy构造函数和copy assignment操作符copy构造函数用于同型对象初始化自我对象时初始化copy assignment操作符用于从一个同型对象中拷贝其值到自我对象赋值操作时copy构造函数的几个运用场所:1)初始化时如Wiget w2;Wiget w1w2;2)初始化赋值时Wiget w2w1;3)类对象值传递的时候
4命名习惯养成选用所实现目标的英文翻译是个不错的选择可以方便阅读和修改例如类中的左右操作数可以定义参数名称为lhs(left-hand-side)和rhs(right-hand-side);
5合理利用TR1class template和function templatehash tablereference-counting smart pointers,regular expressions和boost网站资源提供可移植同僚复审源码开发的C程序库
6C语言是一个多重范型编程语言multiparadigm programming language一个同时支持过程形式procedural、面向对象形式object-oriented、函数形式functional、泛型形式generic、元编程形式metaprogramming的语言。C可以视为由相关语言组成的联邦和非单一语言其中每个次语言中各种守则与通例都倾向于简单直观易懂和容易记住关键是次语言之间切换过程。次语言分为一下几个方面1C区块blocks,语句statement、预处理器preprocessor、内置数据类型bulit-in data types、数组arrays、指针pointers,但在高效编程时C语言却没有C的功能如模板template、异常(exceptions)、重载(overloading)等;2)object-oriented C:classes构造和析构函数、封装encapsulation、继承inheritance、多态polymorphism、virtual函数动态绑定类的三个核心封装继承多态3Template C。C泛型编程的思想4STL。STL是个template程序库它将容器containers、迭代器iterators、算法algorithm以及函数对象function objects联合起来
7尽量使用const,enum,inline替代#define用编译器替代预处理器#define 是在程序预处理的时候执行的它不被看成语言的一部分也就可能会出现所使用的宏变量没有进入到记号表symbol table中修改的方式用一个常量替代宏另外使用const还有一个好处系统会做类型检查同时完成类型的位数限制发生在float中如#define pi 3.141592653;和const float pi3.141592653得到的结果不一样相比之下用const会产生更小量的码值# define并不注重作用域scope的概念一旦定义除非#undef,后面都有效因此不能用于定义类的专属常量也不能提供任何封装性但const却能提供这样的功能const可以将常量的作用域限制在classes内让它成为class的一个成员为了确保常量最多有一份实体你得设置为static成员如class gameplayer{
private:static const int Numturns5;//常量声明式和以往static声明和定义不一样这种成为in-class初值设定 //只允许对整形变量使用还和C编译器是否支持有关//static const double score;一般的static常量声明int score[Numturns];//使用常量
};
const double gameplayer::score95.0;//static常量定义
类中的Numturns是一个声明式而非定义式C要求你对你所使用的任何东西提供定义式但如果它是类的一个专属常量而且还是整形类型int,char,bool则需要特殊处理。只要不取地址可以直接声明并使用不需要提供定义式但如果你取了某个类专属常量的地址或者编译器需要看到一个定义式则你必须提供定义式const int gameplayer::Numturns;//声明时已经赋值定义则不需要赋值(放入实现文件而非头文件中如果编译器不允许static整数型class常量完成in-class初值设定可以用the enum hack补偿方法完成同样功能class gameplayer{
private:enum {Numturns5};int score[Numturns];//使用常量
};引申enum hack知识enum hack的行为有点像#define而非const因为其和#define同样不能取地址而const可以如果不想让别人获得一个指针或者引用指向你的某个常量enum可以实现这个功能此外enum hack是template metaprogramming(模板元编程的基础技术#define常见的误用情况是用它实现宏macros宏看起来像函数却不会招致函数调用带来的额外开销这也是错误的根源如#define CALL_WITH_MAX(a,b) f((a)(b)?(a):(b))int a5;b0;CALL_WITH_MAX(a,b);//a被累加两次 解决方案使用template inline函数会在被调用处代码展开省去参数压栈、栈帧开辟和回收、结果返回同时会做安全检查或者自动类型转换inline void callwithmax(const inta,const intb){f(ab?a:b);}结论对于单纯变量最好以const对象或者enum替换#define;对于函数的宏最好改用inline函数替换#define;
8尽量多使用const:它允许你指定一个语义约束而编译器执行这个约束它允许你告诉编译器和其他程序员某值应该保持不变1STL迭代器中声明迭代器为const,则迭代器指针不能变化声明迭代器内容为const如const_iterator,则迭代器内容不可变2在函数声明式中const可以和返回值、各参数、函数本身产生关联令函数返回一个常量值往往可以降低因用户错误而造成的意外同时不放弃安全性和高效性如无意中输入的ifa*bc)操作可通过返回值设为const来避免这个错误3const成员函数设置成const好处方便理解使操作const对象成为可能编程更加高效如果两个成员函数只是常量constness不同可以被重载这是C的一个特性引申如果函数返回值是一个内置类型那么改动函数返回值是不合法的C以by value返回对象意味着改动的只是对象的一个副本而不是本身这并不是我们希望的因此需要把其设置为引用成员函数是const意味着什么有两种说法bitwise constness(physical constness)和logical constness;bitwise constness认为成员函数不改变对象中的任何成员变量的任何一个bit因此编译器只需要寻找有无成员变量赋值操作bitwise constness这一个特性是C对常量性constness的定义因此const成员函数不能改变对象中的任何non-static成员变量但是在指针的作用下这个const会发生问题如const mystring a(hello world); char *pca[0];*pcj;//改变了const特性logical constness:一个const成员函数可以修改它处理对象内的某些bits,但只有在客户端侦查不出的情况下才能如此如何解除编译器中的bitwise constness特性呢可以使用const相关的一个关键字mutable,mutable可以释放non-static成员变量中的bitwise constness约束4在const和non-const中避免重复的方法用其中一个调用另外一个通过我们采用常量性转移,如
class textblock{
public:const charoperator[](std::size_t position)const //const 成员函数不变{}char operator[](std::size_t position){return const_castchar(//去除返回值conststatic_castconst textblock(*this//this指针添加const[position]);}
};采用non-const调用const版本的函数来避免重复而不是相反的做法原因const变为non-const过程中可能会使得const变量发生变化这与我们预期不合而non-const本身就是可变的不用担心这个现象的发生
结论声明const可以帮助编译器侦查出错误的用法编译器强制实行bitwise constness但可以通过指针方式改变const和non-const成员函数有着实质等价的实现时可以用non-const调用const来避免代码重复