c++
liuwxye
这个作者很懒,什么都没留下…
展开
-
new & delele
int *p = new int; //分配一个 int 大小的空间 delete p;Stash *q = new Stash(); //分配一个 Stash 类大小的空间,并调用构造函数 delete q;Stash *r = new Stash[10];delete r; //只调用第一个析构函数,再收回所有空间delete[] r; //先调用所有析构函数,再收回所有空间i原创 2017-07-16 21:15:12 · 328 阅读 · 0 评论 -
运算符重载:赋值、类型转换
1、区分初始化,赋值#include using namespace std;class Fi{public: Fi() {cout"Fi()"//1构造函数 Fi(const Fi& i){cout"Fi(const Fi& i)"<<endl;} ~Fi(){cout"~Fi()"<<endl; }};class Fee{public:原创 2017-08-02 11:59:59 · 416 阅读 · 0 评论 -
C++ 拷贝构造(一)
如果在一个类Class A的定义中有一个构造函数,这个构造函数的参数是这个A 类型的const 的reference(引用),这个构造函数就可以 在做初始化的时候(A(const A& x))被调用。当定义的类里没有做这类构造函数,而在程序中,又有类似于A a;A a2 = a;这种情况时,编译器会默认自己有一个A(const A& x) 的构造函数。代码一:#include <iostre原创 2017-07-26 22:34:00 · 260 阅读 · 0 评论 -
C++ vector(一)
在C++标准库类型vector表示对象的集合,也称为容器。要想使用vector,需要有合适的头文件。#include <vector>using std::vector;其实vector就是一个函数模板。模板本身不是类或函数,可以将模板看作为编译器生成类或者函数编写的一份说明。vector<int> v1; //v1保存int类型的对象vector<T> t1; //T是一个类,则t1保存T原创 2017-08-05 21:43:44 · 280 阅读 · 0 评论 -
C++继承(public,protected,private)
C++继承与派生:继承与派生是同一过程从不同的角度看: 保持已有类的特性而构造新类的过程称为继承。 在已有类的基础上新增自己的特性而产生新类的过程称为派生。被继承的已有类称为基类(或父类)。派生出的新类称为派生类(或子类)。直接参与派生出某类的基类称为直接基类。基类的基类甚至更高层的基类称为间接基类。继承的目的:实现设计与代码的重用。 派生的目的:当原创 2017-08-13 17:44:17 · 730 阅读 · 0 评论 -
C++ 拷贝构造(二)
如果在代码中没有提供拷贝构造函数,那么C++会自动建立一个拷贝构造函数。这个默认的拷贝构造函数,不是字节对字节的拷贝,而是成员对成员的拷贝。做成员变量对成员变量的拷贝。 在 A类中,如果成员变量是int,则拷贝给int,如果是float,则拷给float ,如果是另一个类B b 的成员,则会用B 的拷贝构造去拷贝构造b,如果B类给出的是默认的拷贝构造(系统给的),那么拷贝构造就会递归下去。原创 2017-07-27 21:55:46 · 315 阅读 · 0 评论 -
C++模板(一)
在vs2015中,namespace里会有一些template,所以在定义的时候,函数名字要注意,否者就会出现 C2668 的编译错误。 解决办法: (1)改自定义的函数名称 (2)不使用using namespace std; ( 3 ) ::youdefinefunction()类声明template <class T>your_func(T &x,原创 2017-08-03 21:41:13 · 388 阅读 · 0 评论 -
C++模板(二)
C++中,可以定义类模板。#include <iostream>using namespace std;template <class T>class Vector {public: Vector(int); ~Vector(); Vector(const Vector&); Vector& operator=(const Vector& rhs); T原创 2017-08-06 21:57:47 · 170 阅读 · 0 评论 -
关于函数传值调用(二级指针)
先看下面代码:#include "stdio.h"void GetMemory( char*p ){ p = (char*) malloc( 100 );}int main(){ char*str = NULL; GetMemory( str ); strcpy( str, "hello world" ); printf( str );}为什么会出现错误?其实原因很简原创 2017-08-15 20:49:34 · 2402 阅读 · 2 评论 -
C++对象 NULL
c++中引用的概念跟java中的不一样,c++中的引用必须绑定到一个实际存在的对象,不能绑定到NULL; 也就是说在c++中 Object &obj=NULL; //这样的句子是绝对违法的而下面这种Object &obj=*(new Object());这样的句子,或许可以编译通过,但是这是非常危险地,因为后面很容易忘记释放这个对象。 string &str=string("123")+"45原创 2017-08-15 20:54:16 · 4606 阅读 · 0 评论 -
C++ 运算符重载和拷贝构造(二)
在运算符重载的过程中,如果是二元的运算符(+,-,*,/,etc),那么成员函数需要有一个参数。如下代码:#include "stdafx.h"#include <iostream>using namespace std;class Integer {public: Integer(int n) :i(n) { cout << "Integer::Integer(int)"<<i <<原创 2017-08-01 14:33:26 · 231 阅读 · 0 评论 -
C++ 二级指针的理解
二级指针是指向指针的指针。 首先我们先来看一段代码#include "stdafx.h"#include <iostream>using namespace std;int main(){ int i=3; int ** p = (int**)&i; //定义一个二级指针p,指向i int *q = &i; cout<<"hello"<<endl;翻译 2017-07-23 13:26:03 · 2011 阅读 · 0 评论 -
C++ STL begin()和front()、end()和back()的区别与用法
begin()函数和end()位于iteartor; 而front()和back()位于vector list deque and etc… - begin()函数函数原型:iterator begin();const_iterator begin();功能:返回一个当前vector容器中起始元素的迭代器。end()函数函数原型: iterator end(); const_it原创 2017-08-12 18:21:19 · 10143 阅读 · 2 评论 -
C++ 默认构造函数
默认构造函数默认的构造函数是指为所有参数都提供了默认值的构造函数,通常是指无参的构造函数。比如下面的类A,默认构造函数即为A()。Class A{ public: A(){};//default constructor };如果你对所定义的类没有提供构造函数,则编译器会自动为你生成一个默认的无参数构造函数;一旦你为你的类定义了构造函数,哪怕只是一个,那么编译器将不再生成默认的翻译 2017-07-16 10:25:52 · 1182 阅读 · 0 评论 -
C++ 基类构造函数带参数的继承方式及派生类的初始化
在定义类的时候,会遇到基类的构造函数带参数,而子类子类构造函数不带参数,这时候如果以代码 a 的方式建立派生类则会出错。代码 a:class A{ public: A(int x, int y) this->i (x),this->j(y){ } private: int i, j;};class B:public A{ public:原创 2017-07-18 10:19:11 · 24474 阅读 · 2 评论 -
C++ 虚函数、对象、类对应的地址
在C++中的多态中,我们通过地址的访问来寻找虚函数、对象、类的地址。具体看代码实现#include "stdafx.h"#include <iostream>using namespace std;class A {public: A() :i(10) {}; virtual void f() { cout << "A::f()" << i << endl;原创 2017-07-21 21:22:11 · 1791 阅读 · 2 评论 -
STL 简述
STL是Standard Template Library的简称,中文名标准模板库。Library包括:A pair class(pairs of anything, int/int, int/char, ,etc)Containers Vector(expandable array)Deque(expandable array, expandable at both ends)List(原创 2017-08-11 21:59:30 · 185 阅读 · 0 评论 -
C++ 引用
在写C语言的时候,我们没有引用这个概念,所以当我们调用函数的时候,通常传一个指针进去调用类。但是,在传指针进去的时候,在函数内部,指针会获得传进去的对象的控制权,很可能会改变对象,去写对象。因此我们可以在指针前面加一个关键字 `const`,通过`const`去实现对对象的保护。而在C++中,有了引用,因此我们不必在函数定义的时候去传指针,更推荐使用引用。这样就避免了在参数表等地方使用`*`。下面原创 2017-07-25 20:36:52 · 288 阅读 · 0 评论 -
new & delete test
#include <iostream>using namespace std;class A { private: int i; public: A(){ i = 0; cout<<"A::A()"<<endl; } ~A(){ cout<<"A::原创 2017-07-16 21:50:21 · 226 阅读 · 0 评论 -
C++ 静态对象
Static in C++Two basic meaningsStatic Storage--allocated once at a fixed addressVisibility of a name--internal linkageDon’t use static except inside functions and classes.Uses of “static” in C++Stati原创 2017-07-29 15:44:06 · 406 阅读 · 0 评论 -
C++ 拷贝构造(三)
如果一个类有指针,需要另外写拷贝构造函数。否则,就会形成浅拷贝,造成两个指针指向同一个内存,在析构的时候出错。#include <iostream>#include<cstring>using namespace std;class Person{public: Person(const char *s); ~Person(); void print(); c原创 2017-07-29 15:22:17 · 254 阅读 · 0 评论 -
C++虚函数及虚函数表在内存中的分配和访问
// Virtual.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>using namespace std;class Base {public: virtual void f() { cout << "base f()" << endl; } virtual void g()原创 2017-07-21 21:25:29 · 580 阅读 · 0 评论 -
C++析构函数
在C++中,当一个类中有一个函数是虚函数的时候,析构函数最好定义为虚函数。因为C++的多态性,如果析构函数~A()不是虚函数,只会是静态绑定,即只会调用基类的析构函数。 #include <iostream>using namespace std;class A{ public: A(){cout<<"A::A()"<<endl; } virtual voi原创 2017-07-23 19:42:42 · 262 阅读 · 0 评论 -
C++ 运算符重载和拷贝构造
为了直观上观察到拷贝构造函数的调用,结合运算符重载来分析,有一下代码:// 运算符重载.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>using namespace std;class Integer {public: Integer(int n) :i(n) { cout << "Integer::Integ原创 2017-07-31 18:37:39 · 454 阅读 · 0 评论 -
C++ 重新定义继承而来的非虚函数
之前在Effective C++看到有一个条款:决不要重新定义继承而来的非虚函数,今天在看代码的时候,发现有人重新定义继承而来的非虚函数,所以重新查看了这个条款。虽然这样做(重新定义继承而来的非虚函数)不会出什么大错,只要注意声明的指针即可。但是我觉得还是不合理。先看例子。我把Effective C++例子补全如下:#include "stdafx.h"#include "stdlib.h"#inc转载 2017-07-23 20:52:14 · 4784 阅读 · 4 评论 -
C++异常
异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。 所以在程序的某部分检测到一个它无法处理的问题时,需要用到异常处理。 首先我们先贴代码#include "stdafx.h"#include <iostream>using namespace std;template <class T>class Vector {public: Vector(int);原创 2017-08-07 21:28:29 · 595 阅读 · 0 评论 -
C++拷贝构造的优化
对于拷贝构造来说,归根结底,落脚点在构造函数上。所以调用拷贝构造函数的时候,一定是这个对象不存在的时候,比如下面这句 A a =A(10)那么,a是不存在的,而且是通过其它的A对象构造出来的,那么则调用的是拷贝构造函数。如果是 A a(1); a = A(10);那么这里就调用的是赋值操作符,因为a是已经存在的对象了,不需要构造了。那么,接下来再讨论一下拷贝构造的优化问题。如果有以下代码: 代原创 2017-08-01 13:03:08 · 666 阅读 · 0 评论 -
[]的重载
C++对[]重载是为了方便实现数组、列表等功能,返回的是左值,所以返回的是对象生成的指针,所以返回一个引用。原型为:-T& T operator[](int index){};#include <iostream>using namespace std;class Vector{ public: Vector(int my_size):size(my_size){原创 2017-08-01 20:47:37 · 2242 阅读 · 0 评论 -
C++异常(二)
c++ try–catch的语句原型如下:try{//程序中抛出异常throw value;}catch(valuetype v){//例外处理程序段}在C++的异常中,程序接受到throw语句后就会自动调用析构器,把该域(try所在的大括号内)对象clean up,然后再进入catch语句(如果在循环体中就退出循环)。 这种机制会引起一些致命的错误,比如,当“类”有指针成员变量时原创 2017-08-08 20:21:16 · 225 阅读 · 0 评论 -
C++向上造型
在C++中,public继承时,如果B是A的子类,那么B的对象就可以被当作A的对象来看待。#include <iostream>using namespace std;class A {private:public: int i; A():i(10){}};class B : public A {private: int j;public: B() :j(3原创 2017-07-20 20:27:00 · 1919 阅读 · 0 评论 -
C++ overload、override、overwrite
对于函数的重载(overload)、覆盖(override)、重写(overwrite)三者的理解,通过代码来分析。重载:是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载解析中不考虑返回类型,而且在不同的作用域里声明的函数也不算是重载。class A{public: void func(int i); void fun原创 2017-07-24 22:08:21 · 2208 阅读 · 0 评论 -
赋值运算符重载和拷贝构造函数
C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝关键词:构造函数,浅拷贝,深拷贝,堆栈(stack),堆heap,赋值运算符摘要: 在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作。 如果对象在申明的同时马上进行的初始化操作,则称之为拷贝运算。例如: class1 A("af"); class1 B=A; 此时其实际调转载 2017-08-02 12:13:32 · 1521 阅读 · 0 评论 -
C++ 静态成员
在C++中,写在类里面的可以理解是声明,而不是定义。所以,当我们在类内定义一个静态成员的时候,需要在类外定义静态成员的存在。#include <iostream>using namespace std;class A{public: A(){ i = 0; } void print(){ cout << i << endl; } void set(int t){ i =原创 2017-07-30 17:33:49 · 625 阅读 · 0 评论 -
C++派生类的构造函数
派生类的构造函数默认情况基类的构造函数不被继承; 派生类需要定义自己的构造函数。C++11规定可用using语句继承基类构造函数。 但是只能初始化从基类继承的成员。 派生类新增成员可以通过类内初始值进行初始化。 语法形式: using B::B; 所以如果派生类有自己新增的成员,且需要通过构造函数初始化,则派生类要自定义构造函数。拓展之using申明: 如果进行原创 2017-08-14 22:00:44 · 1612 阅读 · 0 评论