随笔分类 - c++/c
摘要:第4章96页,数组维数为变量第8章246. IO对象不可复制、赋值原因是类设计时复制构造函数、赋值函数是私有的,为什么这么设计呢?251. tie举例第15章484 派生类可以恢复,但不可扩大#include #include using namespace std;class base{ public: base(int p1=1, int p2=2, int p3=3) : pub(p1), pri(p2), pro(p3) {} int pub; private: int pri; protected: int p...
阅读全文
摘要:c++primer 页数:376-379 备份, 很有嚼头#include #include #include using namespace std;class Screen{ public: typedef string::size_type index; Screen(index r, index c) : row(r), col(c), contents(r * c, 0) {}; Screen& set(index r, index c, char val); Screen& set(char val); S...
阅读全文
摘要:C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区c++内存分配c/c++中static关键字详解c++ staticc++primer 220------------------------------------------------------------------------------------------------------------------------------------------------------------------在C++中,内存分成5个区栈区(stack) 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操
阅读全文
摘要:抽象处理大而复杂的问题的重要手段是抽象,强调事物本质的东西。 对程序抽象而言,一个语言结构的抽象强调的是该结构外部可观察的行为,与该结构的内部实现无关。抽象包括过程抽象和数据抽象。封装封装是把一个语言结构的具体实现细节作为一个黑匣子对该结构的使用者隐藏起来的一种机制,从而符合信息隐藏原则。封装包括过程封装和数据封装。区别 封装考虑内部实现,抽象考虑的是外部行为封装是屏蔽细节,抽象是提取共性图例
阅读全文
摘要:缘起:《c++ primer》 4th, 528页,习题16.3源程序#include #include #include using namespace std;templateint compare(const S &v1, const S &v2){ if (v1 v2) return 1; else return 0;}int main(){ string s1 = "hi"; string s2 = "world"; cout #include using namespace std;templateint compare...
阅读全文
摘要:字符数组既可以用一组花括号括起来、逗号隔开的字符字面值隔开的字面值进行初始化: char ca1[] = {'1', '2', '3'};也可以用字符串字面值进行初始化: char ca2[] = "123";两者区别字符串字面值包含一个额外的空字符(null)(这是为了兼容c语言,c++中所有字符串字面值都由编译器自动在末尾添加一个空字符)。案例#include #include using namespace std;int main(){ char a[] = {'a', 'b',
阅读全文
摘要:#include #include using namespace std;class Base{ public: virtual void print_val() { cout print_val(); yb.print_val();}运行结果现象程序用了三种方式来测试虚函数的调用:基类对象、基类指针、基类引用。由结果可以看出,当用引用、指针调用虚函数是调用的是派生类的实际函数,而不是基类的虚函数。结论当通过基类的对象直接调用虚函数时,总是调用该对象所属的函数。所以ob是基类的对象,调用的是基类的实例当使用指向基类的指针或引用调用...
阅读全文
摘要:静态全局变量#include using namespace std;static size_t ctr = 0;size_t count_calls(){ return ++ctr;}int main(){ for(size_t i=0; i using namespace std;size_t count_calls(){ static size_t ctr = 0; return ++ctr;}int main(){ for(size_t i=0; i using namespace std;static void fn(){ int n = 10; ...
阅读全文
摘要:#include #include using namespace std;class Item_base { public: Item_base(const string &book = "", double sales_price = 0.0): isbn(book), price(sales_price) {} string book() const { return isbn; } virtual double net_price(size_t n) const ...
阅读全文
摘要:重载相同的范围(在同一个类中)函数名相同参数不同virtual关键字可有可无重载与继承、隐藏很好区分,因为重载函数在同一个类中举例说明#include using namespace std;class Base{ public: void f(int x) {cout #include using namespace std;class base{ public: virtual void test(int a, int b) { cout #include using namespace std;class base{ public: ...
阅读全文
摘要:malloc/free是c++/c的标准库函数,new/delete 是c++的运算符。两者都可以申请动态内存和释放内存。对于非内部数据类型的对象而言,光用malloc/free是无法满足动态对象的要求的。对象在创建时需要自动调用构造函数,在消亡时需要调用析构函数。由于malloc/free是库函数而不是运算符,不在编译器的控制权限之内,不能把自动执行构造函数和析构函数的任务强加给malloc/free。举例说明:#include #include using namespace std;class A{ public: A(void); ~A(void);}...
阅读全文
摘要:使用free或delete之后,只是把指针所指的内容给释放掉,但是指针并没有被干掉,还是指向原来位置(并不是执行NULL),此时指针指向的内容为垃圾,被称为“野指针”。举例说明几个重要容易迷糊的特征:1. 指针消亡了,并不表示他所指向的内存会被自动释放。例:void func(coid){ char *p = (char *)malloc(sizeof(char) * 100);}当函数执行完时,指针变量因为存在于栈上,会自动消亡。但是这不意味着分配的空间也会自动释放,原因是:动态非配的空间位于堆(动态内存分配区),必须自己去释放;否则,调用一次函数,造成一次内存泄露。2. 内存被释放了,..
阅读全文
摘要:参数策略如果函数的参数是一个指针,不要指望用该指针去动态申请内存。如下:void GetMemory(char *p, int num){ p = (char *)malloc(sizeof(char) * num);}void Test(void){ char *str = NULL; GetMemory(str, 100); //str仍未NULL strcpy(str, "hello"); //运行错误}原因是编译器总是为每个参数制作临时副本。指针参数p, 其副本为_p,使_p=p。如果改变了_p所指的内容,相应的p所指的内容也跟着改变(毕竟指向同样...
阅读全文
摘要:内容复制与比较数组char a[] = "hello";char b[10];strcpy(b, a); //复制,不可以b = aif (strcmp(b, a) == 0); //比较,不可以 if (b == a)指针int len = strlen(a);char *p = (char *) malloc(sizeof(char)*(len+1)) 动态分配存储空间,不可以空穴来风,直接拷贝东西strcpy(p, a); //复制,不可以p = aif (strcmp(p, a) == 0); //比较,不可以 if (p == a)
阅读全文
摘要:构造函数、析构函数、赋值函数是每个类最基本的的函数。每个类只有一个析构函数和一个赋值函数。但是有很多构造函数(一个为复制构造函数,其他为普通构造函数。对于一个类A,如果不编写上述四个函数,c++编译器将自动为A产生四个默认的函数,即:A(void) //默认无参数构造函数A(const A &a) //默认复制构造函数~A(void); //默认的析构函数A & operator = (const A &a); //默认的赋值函数既然能自动生成函数,为什么还需要自定义?原因之一是“默认的复制构造函数”和"默认的赋值函数“均采用”位拷贝“而非”值拷贝“位拷贝 v
阅读全文
摘要:const成员变量 举个例子 说明 在类中声明变量为const类型,但是不可以初始化 const常量的初始化必须在构造函数初始化列表中初始化,而不可以在构造函数函数体内初始化 但是 此时的const变量属于具体的一个对象,如何在整个类中都恒定不变呢? 答案是利用枚举,举例 枚举常量不会占据对象的存储
阅读全文
摘要:1. 尽可能在定义变量的同时初始化该变量(就近原则)——防止忘记初始化,引用未被初始化的变量,可能导致程序错误2. 代码行最大长度宜控制在70~80个字符以内(长行拆分)——否则眼睛看不过来,也不便于打印。例如:virtual CMatrix CMultiplyMatrix (CMatrix leftMatrix, CMatrix rightMatrix);3. 命名规则变量名字:名词 or 形容词+名词。例如:int value, oldValue;全局函数名字:动词 or 动词+名词。例如:DrawBox();类的成员函数名...
阅读全文
摘要:c++引入友元的原因在某些情况下,允许特定的非成员函数访问类的私有成员。在类中以关键字friend开始(只能出现在类定义的内部),声明为友元的可以为类、类的成员函数、普通的非成员函数。速览#include #include using namespace std;class b;class f { friend b; public: void print_a() { cout #include using namespace std;class Sales_item;class A { public: void fuc(Sales_item &)...
阅读全文
摘要:缘起#include #include using namespace std;int main(){ istringstream iss; string str1, str2, str3, str4, str5, str6; iss.str("I love you"); iss >> str1 >> str2 >> str3; cout > str4 >> str5 >> str6; cout #include using namespace std;int main(){ istringstream is
阅读全文
摘要:为了使自己的程序有很好的移植性,c++程序员应该尽量使用size_t和size_type而不是int, unsigned1. size_t是全局定义的类型;size_type是STL类中定义的类型属性,用以保存任意string和vector类对象的长度2. string::size_type制类型一般就是unsignedint,但是不同机器环境长度可能不同win32和win64上长度差别;size_type一般也是unsignedint 3. 使用的时候可以参考: string::size_typea=123; vectorsize_typeb=234; size_tb=456; 4. s..
阅读全文

浙公网安备 33010602011771号