当前位置:文档之家› C++中new 的用法大全 详细

C++中new 的用法大全 详细

C++中new 的用法大全 详细
C++中new 的用法大全 详细

深入C++的new

―new‖是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。

new的过程

当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A:

class A

{

int i;

public:

A(int _i) :i(_i*_i) {}

void Say() { printf("i=%dn", i); }

};

//调用new:

A* pa = new A(3);

那么上述动态创建一个对象的过程大致相当于以下三句话(只是大致上):

A* pa = (A*)malloc(sizeof(A));

pa->A::A(3);

return pa;

虽然从效果上看,这三句话也得到了一个有效的指向堆上的A对象的指针pa,但区别在于,当malloc 失败时,它不会调用分配内存失败处理程序new_handler,而使用new的话会的。因此我们还是要尽可能的使用new,除非有一些特殊的需求。

new的三种形态

到目前为止,本文所提到的new都是指的―new operator‖或称为―new expression‖,但事实上在C++中一提到new,至少可能代表以下三种含义:new operator、operator new、placement new。

new operator就是我们平时所使用的new,其行为就是前面所说的三个步骤,我们不能更改它。但具体到某一步骤中的行为,如果它不满足我们的具体要求时,我们是有可能更改它的。三个步骤中最后一步只是简单的做一个指针的类型转换,没什么可说的,并且在编译出的代码中也并不需要这种转换,只是人为的认识罢了。但前两步就有些内容了。

new operator的第一步分配内存实际上是通过调用operator new来完成的,这里的new实际上是像加减乘除一样的操作符,因此也是可以重载的。operator new默认情况下首先调用分配内存的代码,尝试得到一段堆上的空间,如果成功就返回,如果失败,则转而去调用一个new_hander,然后继续重复前面过程。如果我们对这个过程不满意,就可以重载operator new,来设置我们希望的行为。例如:class A

{

public:

void* operator new(size_t size)

{

printf("operator new calledn");

return ::operator new(size);

}

};

A* a = new A();

这里通过::operator new调用了原有的全局的new,实现了在分配内存之前输出一句话。全局的operator new也是可以重载的,但这样一来就不能再递归的使用new来分配内存,而只能使用malloc 了:

void* operator new(size_t size)

{

printf("global newn");

return malloc(size);

}

相应的,delete也有delete operator和operator delete之分,后者也是可以重载的。并且,如果重载了operator new,就应该也相应的重载operator delete,这是良好的编程习惯。

new的第三种形态——placement new是用来实现定位构造的,因此可以实现new operator三步操作中的第二步,也就是在取得了一块可以容纳指定类型对象的内存后,在这块内存上构造一个对象,这有点类似于前面代码中的―p->A::A(3);‖这句话,但这并不是一个标准的写法,正确的写法是使用placement new:

#include

void main()

{

char s[sizeof(A)];

A* p = (A*)s;

new(p) A(3); //p->A::A(3);

p->Say();

}

对头文件的引用是必须的,这样才可以使用placement new。这里―new(p) A(3)‖这种奇怪的写法便是placement new了,它实现了在指定内存地址上用指定类型的构造函数来构造一个对象的功能,后面A(3)就是对构造函数的显式调用。这里不难发现,这块指定的地址既可以是栈,又可以是堆,placement对此不加区分。但是,除非特别必要,不要直接使用placement new ,这毕竟不是用来构造对象的正式写法,只不过是new operator的一个步骤而已。使用new operator地编译器会自动生成对placement new的调用的代码,因此也会相应的生成使用delete时调用析构函数的代码。如果是像上面那样在栈上使用了placement new,则必须手工调用析构函数,这也是显式调用析构函数的唯一情况:

p->~A();

当我们觉得默认的new operator对内存的管理不能满足我们的需要,而希望自己手工的管理内存时,placement new就有用了。STL中的allocator就使用了这种方式,借助placement new来实现更灵活有效的内存管理。

处理内存分配异常

正如前面所说,operator new的默认行为是请求分配内存,如果成功则返回此内存地址,如果失败则调用一个new_handler,然后再重复此过程。于是,想要从operator new的执行过程中返回,则必然需要满足下列条件之一:

l分配内存成功

l new_handler中抛出bad_alloc异常

l new_handler中调用exit()或类似的函数,使程序结束

于是,我们可以假设默认情况下operator new的行为是这样的:

void* operator new(size_t size)

{

void* p = null

while(!(p = malloc(size)))

{

if(null == new_handler)

throw bad_alloc();

try

{

new_handler();

}

catch(bad_alloc e)

{

throw e;

}

ca tch(…)

{}

}

return p;

}

在默认情况下,new_handler的行为是抛出一个bad_alloc异常,因此上述循环只会执行一次。但如果我们不希望使用默认行为,可以自定义一个new_handler,并使用std::set_new_handler函数使其生效。在自定义的new_handler中,我们可以抛出异常,可以结束程序,也可以运行一些代码使得有可能有内存被空闲出来,从而下一次分配时也许会成功,也可以通过set_new_handler来安装另一个可能更有效的new_handler。例如:

void MyNewHandler()

{

printf(―New handler called!n‖);

throw std::bad_alloc();

}

std::set_new_handler(MyNewHandler);

这里new_handler程序在抛出异常之前会输出一句话。应该注意,在new_handler的代码里应该注意避免再嵌套有对new的调用,因为如果这里调用new再失败的话,可能会再导致对new_handler 的调用,从而导致无限递归调用。——这是我猜的,并没有尝试过。

在编程时我们应该注意到对new的调用是有可能有异常被抛出的,因此在new的代码周围应该注意保持其事务性,即不能因为调用new失败抛出异常来导致不正确的程序逻辑或数据结构的出现。例如:class SomeClass

{

static int count;

SomeClass() {}

public:

static SomeClass* GetNewInstance()

{

count++;

return new SomeClass();

}

};

静态变量count用于记录此类型生成的实例的个数,在上述代码中,如果因new分配内存失败而抛出异常,那么其实例个数并没有增加,但count变量的值却已经多了一个,从而数据结构被破坏。正确的写法是:

static SomeClass* GetNewInstance()

{

SomeClass* p = new SomeClass();

count++;

return p;

}

这样一来,如果new失败则直接抛出异常,count的值不会增加。类似的,在处理线程同步时,也要注意类似的问题:

void SomeFunc()

{

lock(someMutex); //加一个锁

delete p;

p = new SomeClass();

unlock(som eMutex);

}

此时,如果new失败,unlock将不会被执行,于是不仅造成了一个指向不正确地址的指针p的存在,还将导致som eMutex永远不会被解锁。这种情况是要注意避免的。(参考:C++箴言:争取异常安全的代码)

STL的内存分配与traits技巧

在《STL原码剖析》一书中详细分析了SGI STL的内存分配器的行为。与直接使用new operator 不同的是,SGI STL并不依赖C++默认的内存分配方式,而是使用一套自行实现的方案。首先SGI STL 将可用内存整块的分配,使之成为当前进程可用的内存,当程序中确实需要分配内存时,先从这些已请求好的大内存块中尝试取得内存,如果失败的话再尝试整块的分配大内存。这种做法有效的避免了大量内存碎片的出现,提高了内存管理效率。

为了实现这种方式,STL使用了placement new,通过在自己管理的内存空间上使用placement new来构造对象,以达到原有new operator所具有的功能。

template

inline void construct(T1* p, const T2& value)

{

new(p) T1(value);

}

此函数接收一个已构造的对象,通过拷贝构造的方式在给定的内存地址p上构造一个新对象,代码中后半截T1(value)便是placement new语法中调用构造函数的写法,如果传入的对象value正是所要求的类型T1,那么这里就相当于调用拷贝构造函数。类似的,因使用了placem ent new,编译器不会自动产生调用析构函数的代码,需要手工的实现:

template

inline void destory(T* pointer)

{

pointer->~T();

}

与此同时,STL中还有一个接收两个迭代器的destory版本,可将某容器上指定范围内的对象全部销毁。典型的实现方式就是通过一个循环来对此范围内的对象逐一调用析构函数。如果所传入的对象是非简单类型,这样做是必要的,但如果传入的是简单类型,或者根本没有必要调用析构函数的自定义类型(例如只包含数个int成员的结构体),那么再逐一调用析构函数是没有必要的,也浪费了时间。为此,STL 使用了一种称为―type traits‖的技巧,在编译器就判断出所传入的类型是否需要调用析构函数:template

inline void destory(ForwardIterator first, ForwardIterator last)

{

__destory(first, last, value_type(first));

}

其中value_type()用于取出迭代器所指向的对象的类型信息,于是:

template

inline void __destory(ForwardIterator first, ForwardIterator last, T*)

{

typedef typename __type_traits::has_trivial_destructor trivial_destructor;

__destory_aux(first, last, trivial_destructor());

}

//如果需要调用析构函数:

template

inline void __destory_aux(ForwardIterator first, ForwardIterator last, __false_type)

{

for(; first < last; ++first)

destory(&*first); //因first是迭代器,*first取出其真正内容,然后再用&取地址

}

//如果不需要,就什么也不做:

tempalte

inline void __destory_aux(ForwardIterator first, ForwardIterator last, __true_type)

{}

因上述函数全都是inline的,所以多层的函数调用并不会对性能造成影响,最终编译的结果根据具体的类型就只是一个for循环或者什么都没有。这里的关键在于__type_traits这个模板类上,它根据不同的T类型定义出不同的has_trivial_destructor的结果,如果T是简单类型,就定义为__true_type 类型,否则就定义为__false_type类型。其中__true_type、__false_type只不过是两个没有任何内容的类,对程序的执行结果没有什么意义,但在编译器看来它对模板如何特化就具有非常重要的指导意义了,正如上面代码所示的那样。__type_traits也是特化了的一系列模板类:

struct __true_type {};

struct __false_type {};

template

struct __type_traits

{

public:

typedef __false _type has_trivial_destructor;

……

};

template<> //模板特化

struct __type_traits //int的特化版本

{

public:

typedef __true_type has_trivial_destructor;

……

};

…… //其他简单类型的特化版本

如果要把一个自定义的类型MyClass也定义为不调用析构函数,只需要相应的定义

__type_traits的一个特化版本即可:

template<>

struct __type_traits

{

public:

typedef __true_type has_trivial_destructor;

……

};

模板是比较高级的C++编程技巧,模板特化、模板偏特化就更是技巧性很强的东西,STL中的

type_traits充分借助模板特化的功能,实现了在程序编译期通过编译器来决定为每一处调用使用哪个特化版本,于是在不增加编程复杂性的前提下大大提高了程序的运行效率。更详细的内容可参考《STL源码剖析》第二、三章中的相关内容。

带有―[]‖的new和delete

我们经常会通过new来动态创建一个数组,例如:

char* s = new char[100];

……

delete s;

严格的说,上述代码是不正确的,因为我们在分配内存时使用的是new[],而并不是简单的new,但释放内存时却用的是delete。正确的写法是使用delete[]:

delete[] s;

但是,上述错误的代码似乎也能编译执行,并不会带来什么错误。事实上,new与new[]、delete 与delete[]是有区别的,特别是当用来操作复杂类型时。假如针对一个我们自定义的类MyClass使用new[]:

MyClass* p = new MyClass[10];

上述代码的结果是在堆上分配了10个连续的MyClass实例,并且已经对它们依次调用了构造函数,于是我们得到了10个可用的对象,这一点与Java、C#有区别的,J ava、C#中这样的结果只是得到了10个null。换句话说,使用这种写法时MyClass必须拥有不带参数的构造函数,否则会发现编译期错误,因为编译器无法调用有参数的构造函数。

当这样构造成功后,我们可以再将其释放,释放时使用delete[]:

delete[] p;

当我们对动态分配的数组调用delete[]时,其行为根据所申请的变量类型会有所不同。如果p指向简单类型,如int、char等,其结果只不过是这块内存被回收,此时使用delete[]与delete没有区别,但如果p指向的是复杂类型,delete[]会针对动态分配得到的每个对象调用析构函数,然后再释放内存。因此,如果我们对上述分配得到的p指针直接使用delete来回收,虽然编译期不报什么错误(因为编译器根本看不出来这个指针p是如何分配的),但在运行时(DEBUG情况下)会给出一个Debug assertion failed提示。

到这里,我们很容易提出一个问题——delete[]是如何知道要为多少个对象调用析构函数的?要回答这个问题,我们可以首先看一看new[]的重载。

class MyClass

{

int a;

public:

MyClass() { printf("ctorn"); }

~MyClass() { printf("dtorn"); }

};

void* operator new[](size_t size)

{

void* p = operator new(size);

printf("calling new[] with size=%d address=%pn", size, p);

return p;

}

// 主函数

MyClass* mc = new MyClass[3];

printf("address of mc=%pn", mc);

delete[] mc;

运行此段代码,得到的结果为:(VC2005)

calling new[] with size=16 address=003A5A58

ctor

ctor

ctor

address of mc=003A5A5C

dtor

dtor

dtor

虽然对构造函数和析构函数的调用结果都在预料之中,但所申请的内存空间大小以及地址的数值却出现了问题。我们的类MyClass的大小显然是4个字节,并且申请的数组中有3个元素,那么应该一共申请12个字节才对,但事实上系统却为我们申请了16字节,并且在operator new[]返后我们得到的内存地址是实际申请得到的内存地址值加4的结果。也就是说,当为复杂类型动态分配数组时,系统自动在最终得到的内存地址前空出了4个字节,我们有理由相信这4个字节的内容与动态分配数组的长度有关。通过单步跟踪,很容易发现这4个字节对应的int值为0x00000003,也就是说记录的是我们分配的对象的个数。改变一下分配的个数然后再次观察的结果证实了我的想法。于是,我们也有理由认为new[] operator 的行为相当于下面的伪代码:

template

T* New[](int count)

{

int size = sizeof(T) * count + 4;

void* p = T::operator new[](size);

*(int*)p = count;

T* pt = (T*)((int)p + 4);

for(int i = 0; i < count; i++)

new(&pt[i]) T();

return pt;

}

上述示意性的代码省略了异常处理的部分,只是展示当我们对一个复杂类型使用new[]来动态分配数组时其真正的行为是什么,从中可以看到它分配了比预期多4个字节的内存并用它来保存对象的个数,然后对于后面每一块空间使用placement new来调用无参构造函数,这也就解释了为什么这种情况下类必须有无参构造函数,最后再将首地址返回。类似的,我们很容易写出相应的delete[]的实现代码:template

void Delete[](T* pt)

{

int count = ((int*)pt)[-1];

for(int i = 0; i < count; i++)

pt[i].~T();

void* p = (void*)((int)pt – 4);

T::operator delete[](p);

}

由此可见,在默认情况下operator new[]与operator new的行为是相同的,operator delete[]与operator delete也是,不同的是new operator与new[] operator、delete operator与delete[] operator。当然,我们可以根据不同的需要来选择重载带有和不带有―[]‖的operator new和delete,以满足不同的具体需求。

把前面类MyClass的代码稍做修改——注释掉析构函数,然后再来看看程序的输出:

calling new[] with size=12 address=003A5A58

ctor

ctor

ctor

address of mc=003A5A58

这一次,new[]老老实实的申请了12个字节的内存,并且申请的结果与new[] operator返回的结果也是相同的,看来,是否在前面添加4个字节,只取决于这个类有没有析构函数,当然,这么说并不确切,正确的说法是这个类是否需要调用构造函数,因为如下两种情况下虽然这个类没声明析构函数,但还是多申请了4个字节:一是这个类中拥有需要调用析构函数的成员,二是这个类继承自需要调用析构函数的类。于是,我们可以递归的定义―需要调用析构函数的类‖为以下三种情况之一:

1 显式的声明了析构函数的

2 拥有需要调用析构函数的类的成员的

3 继承自需要调用析构函数的类的

类似的,动态申请简单类型的数组时,也不会多申请4个字节。于是在这两种情况下,释放内存时使用delete或delete[]都可以,但为养成良好的习惯,我们还是应该注意只要是动态分配的数组,释放时就使用delete[]。

释放内存时如何知道长度

但这同时又带来了新问题,既然申请无需调用析构函数的类或简单类型的数组时并没有记录个数信息,那么operator delete,或更直接的说free()是如何来回收这块内存的呢?这就要研究malloc()返回的内存的结构了。与new[]类似的是,实际上在malloc()申请内存时也多申请了数个字节的内容,只不过这与所申请的变量的类型没有任何关系,我们从调用malloc时所传入的参数也可以理解这一点——它只接收了要申请的内存的长度,并不关系这块内存用来保存什么类型。下面运行这样一段代码做个实验:char *p = 0;

for(int i = 0; i < 40; i += 4)

{

char* s = new char[i];

printf("alloc %2d bytes, address=%p distance=%dn", i, s, s - p);

p = s;

}

我们直接来看VC2005下Release版本的运行结果,DEBUG版因包含了较多的调试信息,这里就不分析了:

alloc 0 bytes, address=003A36F0 distance=3815152

alloc 4 bytes, address=003A3700 distance=16

alloc 8 bytes, address=003A3710 distance=16

alloc 12 bytes, address=003A3720 distance=16

alloc 16 bytes, address=003A3738 distance=24

alloc 20 bytes, address=003A84C0 distance=19848

alloc 24 bytes, address=003A84E0 distance=32

alloc 28 bytes, address=003A8500 distance=32

alloc 32 bytes, address=003A8528 distance=40

alloc 36 bytes, address=003A8550 distance=40

每一次分配的字节数都比上一次多4,distance值记录着与上一次分配的差值,第一个差值没有实际意义,中间有一个较大的差值,可能是这块内存已经被分配了,于是也忽略它。结果中最小的差值为16字节,直到我们申请16字节时,这个差值变成了24,后面也有类似的规律,那么我们可以认为申请所得的内存结构是如下这样的:

从图中不难看出,当我们要分配一段内存时,所得的内存地址和上一次的尾地址至少要相距8个字节(在DEBUG版中还要更多),那么我们可以猜想,这8个字节中应该记录着与这段所分配的内存有关的信息。观察这8个节内的内容,得到结果如下:

图中右边为每次分配所得的地址之前8个字节的内容的16进制表示,从图中红线所表示可以看到,这8个字节中的第一个字节乘以8即得到相临两次分配时的距离,经过试验一次性分配更大的长度可知,第二个字节也是这个意义,并且代表高8位,也就说前面空的这8个字节中的前两个字节记录了一次分配内存的长度信息,后面的六个字节可能与空闲内存链表的信息有关,在翻译内存时用来提供必要的信息。这就解答了前面提出的问题,原来C/C++在分配内存时已经记录了足够充分的信息用于回收内存,只不过我们平常不关心它罢了。

中考英语口语辅导:consider的用法

中考英语口语辅导:consider的用法 表示“考虑”,其后可接动名词,但不能接不定式。如He is considering changing his job. 他在考虑调换工作。I’ve never really considered getting married. 我从未考虑过结婚的事。注:consider 之后虽然不能直接跟不定式,但可跟“疑问词+不定式”结构。如Have you considered how to get there / how you could get there. 你是否考虑过何到那儿去?2. 表示“认为”、“把……看作”,下面三个句型值得注意(有时三者可互换) (1) consider +that从句(2) consider+宾语+(as +)名词或形容词(3) consider+宾语+(to be +)名词或形容词I consider him (as) honest (或an honest man). I consider him (to be) honest (或an honest man). I consider that he is honest (或an honest man). 注:(1) 以上备句意思大致相同,对于consider 之后能否接as 的问题,尚有不同看法(即有人认为不能接as ,有人认为可以拉as,但实际上接as 的用法已很普遍)。(2) 在“consider+宾语”之后除可接to be 外,有时也可to do 型动词(但多为完成形式)。如We all considered him to have acted disgracefully. 我们都认为他的行为很不光彩。

日本积水cleanPVC洁净管道的使用详细说明

日本积水cleanPVC洁净管道 的使用详细说明 洁净管道通过电脑处理,把PVC树脂、稳定剂、润滑剂、着色剂、填充剂进行混炼,然后抽入挤出机加料斗,在加热的同时,通过螺杆转动,将原料向前推移挤压,使之逐渐呈熔融状塑化带,进入机头模具,挤压出柔软的管状制品,再通过真空定径,喷淋冷却,喷涂标志、牵引切割、胀口等一系列过程,制成PVC洁净管道。 日本积水cleanPVC洁净管道的使用: 1.对PVC洁净管道大面积损坏的需更换整段管材,可采用双承口连接件更换管材的办法。 2.对溶剂粘接处渗漏的处理,可采用溶剂法。此时先排干管内的水,并使管内形成负压,然后将粘接剂注在渗漏部位的孔隙上。 3.套补粘接法主要是针对PVC洁净管道穿小孔和接头的渗漏。按粘接接头的方法将套管内面和被补管材的外表面打毛,涂胶后套在漏水处贴紧。 4.玻璃纤维法是用环氧树脂加固化剂配成树脂溶液,用玻璃纤维布浸渍树脂溶液后,均匀缠绕在PVC洁净管道或接头渗漏处的表面,经固化后成为玻璃钢。

PVC洁净管材应用领域: 1.自来水配管工程,由于PVC洁净管道具有耐酸碱、耐腐蚀、不生锈、不结垢、保护水质、避免水质受到二次污染的优点,在大力提倡生产环保产品的今天,作为一种保护人类健康的理想“绿色建材”,已被中国乃至全球广泛推广应用。 2.节水灌溉配管工程,日本积水cleanPVC洁净管道使用与普通 灌溉相比,在中国水资源缺乏、农业生产灌溉方式落后的今天,这对促进中国节水农业生产发展有着极大的社会效益。 3.建筑用配管工程。 4.PVC洁净管道具有优异的绝缘能力,还广泛用作邮电通讯电缆导管。 5.PVC洁净管道耐酸碱、耐腐蚀,许多化工厂用作输液配管。其他还用于凿井工程、医药配管工程、矿物盐水输送配管工程、电气配管工程等。

疑问代词用法总结及练习

疑问代词用法总结及练习 句子是英语学习的核心。从句子使用的目的来分,它可分为四类 1、陈述句(肯定句和否定句) 2、疑问句(一般疑问句、特殊疑问句和选择疑问句) 3、祈使句(肯定句和否定句) 4、感叹句。 四大句子类型的相互转换,对于学生来讲是个难点,为此,可通过说顺口溜的形式来帮助学生解决这一难题。 如:将陈述句变成一般疑问句,可以变成这样的顺口留:疑问疑问调个头,把be(系动词“is are am”)放在最前头。 如:将陈述句的肯定句变成否定句,我们就可以这样说:否定,否定加“not”,加在何处,加在系动词的后面。 在句子相互转换的题型中,最难的要算“就下列划线部分提问”或是“看答句,写问句”这种题型了,其实,我们只要熟练掌握疑问词(what,what time, what colour, where, when, who, whose, which, how, how old ,how tall, how long, how big, how heavy , how much, how many等等)具体用法。

习题 一、选择正确的单词填空 (who, where, when) is that pretty girl She is my sister. are Jack and Tom They are behind you. do you go to school I go to school from Monday to Friday. has a beautiful flower John has a beautiful flower.

are they They are my parents. is my mother She is in the living room. are you going We are going to the bakery(面包坊). Jim and Wendy play ball They play ball in the afternoon. does he jog He jogs in the park. are you from I'm from Changchun city. 11. _______ is your birthday –On May 2nd. 12、_______ are you --- I`m in the office. 13. are you ---- I`m Alice. 二.用(what time, what color, what day, what)填空。 1. A: ______ _______ is it B: It is nine o’clock. 2. A: ______ _______ does your mother get up B: My mother gets up at 6:30. 3. A: ______ _______ do you go to bed B: I go to bed at 10:00. 4. A: ______ _______ do Diana and Fiona have supper B: Diana and Fiona have supper at 18:00. 5. A: ______ _______is it B: It is purple. 6. A: ______ _______ is the sky B: The sky is blue. 7. A: ______ _______ is your coat B: My coat is black. 8. A: ______ _______ is the dog B: The dog is white. 9. A: ______ _______ is today B: Today is Monday. 10. A: ______ _______ is tomorrow B: Tomorrow is Tuesday. 11. A: ______ _______ was yesterday B: Yesterday was Sunday. 12. A: ______ _______ do you like B: I like red. 13. A: ______ is this This is a computer. 14. A: ______ are you doing B: We are playing basketball.

consider的基本用法及与regardthinkofabout

consider的基本用法及与regard,think ofabout和look(up)on as的区别 consider的基本用法及与regard,think of/about和look(up)on as的区别 consider一词在历年高考中是一个常考的要点,其用法应分为两部分来讲。第一、作“考虑、思考”时的搭配如下: 1.consider+n./pron.,例如: Have you considered the suggestion? That’s what we have to consider now. 2.consider+v-ing,但不能接不定式的一般式,例如: We considered going to see the doctor the next day. Have you considered moving to shanghai recently? You must consider to tell him something about it.(错误) 3.consider+疑问词+不定式,例如: He is considering how to improve his English. We must consider what to do next.

4.consider+从句,例如: We didn’t consider whether he should go or not. Have you considered when we should go there? 第二、作“认为、把……当作/看作”等意思时的搭配如下:1.consider+sb/sth+(to be/as)+n./adj.,例如: I consider him to(be/as)my best friend. Everyone considers him(to be)clever. He considered it much improved. 2.consider+sb./sth.+不定式短语(作宾语补足语),不能接不定式的一般式,例如: We consider them to be working very hard. We consider them to have finished the work. We consider him to be the clever in our class. We must consider him to go there at once.(错误) 3.consider+it+adj./n.+不定式短语,其中it为形式宾语,不定式短语为真正的宾语,例如: Jiao Yulu considered it his duty to serve the people heart and soul. They consider it necessary to set the slaves free.

英语一般疑问句用法总结

英语一般疑问句用法总结 1. 基本用法及结构 一般疑问句用于对某一情况提出疑问,通常可用yes和no来回答,读时用升调。其基本结构是“be / have / 助动词+主语+谓语(表语)”: Is he interested in going? 他有兴趣去吗? Have you ever been to Japan? 你到过日本吗? Does she often have colds? 她常常感冒吗? Did you ask her which to buy? 你问没问她该买哪一个? 2. 陈述句变一般疑问句的方法 (1) 动词be的否定式。动词be根据不同的时态和人称可以有am, is, are, was, were等不同形式,可用作连系动词(表示“是”、“在”等)和助动词(用于构成进行时态和被动语态等),但不管何种情况,构成疑问式时,一律将动词be的适当形式置于句首: Am I right? 我是对的吗? Are you feeling better today? 你今天感到好些了吗? Was he late for school? 他上学迟到了吗? (2) 动词have的疑问式。动词have根据不同的时态和人称可以有have, has, had等形式,可以用作实意动词和助动词,分以下情况讨论:

①用作实意动词表示状态,如表示拥有、患病或用于have to 表示“必须”等,在构成构成式时可以直接将have, has, had置于句首,也可根据情况在句首使用do, does, did: Does he have [Has he] anything to say? 他有什么话要说吗? Do you have [Have you] to leave so soon? 你必须这么早走吗? Did you have [Had you] any friends then? 他当时有朋友吗? ②用作实意动词表示动作,如表示“吃(=eat)”、“喝(=drin k)”、“拿(=take)”、“收到(=receive)”、“度过(=spend)”等,构成疑问式时不能将have提前至句首,而应在句首使用do, does, did: Does he have breakfast at home? 他在家吃早餐吗? Did you have a good time at the party? 你在晚会上玩得高兴吗? ③用作助动词构成完成时态,其疑问式总是将have等置于句首: Have you finished your work? 你的工作做完了吗? Has he left when you arrived? 你到达时他已离开了吗? (3) 情态动词的疑问式。情态动词的疑问式通常是将情态动词置于句首: Can you speak English? 你会说英语吗?

Consider的用法

Consider的用法: -Have you considered_____ the job ss a teacher? -Yes.I like it because a teacher is often considered _______ a gardener. A.to take,to be B.to take,being C.taking,being D.taking,to be 答案:d译文:你考虑过做老师的工作吗? 是的,我非常喜欢,因为老师通常被认为是园丁 一、consider作“考虑”解,常用于以下句型: 1.consider+名词/代词/动名词。 You'd better consider my suggestion. 你最好考虑我的建议。 I’m considering going abroad some day.我一直考虑有一天出国。 2.consider+从句或“疑问词+不定式”。 Have you considered what he suggested? 你们考虑他的建议了吗? We must consider what to do next. 我们必须考虑下一步要做什么。 二.consider作“认为”解时,常用于以下句型: 1.consider sb./sth+.(as)+形容词/名词。其中,as可以省略。 We consider him honest. 我们认为他很诚实。 At first they considered me as a doctor.起初他们认为我是医生。 2.consider+sb./sth.+不定式。其中,不定式通常是to be(可以省略)或其他动词的完成式。We consider this matter to be very important. 我们认为这件事很重要。 We all consider him to have stolen the bike.我们都认为他偷了自行车。 3.consider+it+形容词/名词+不定式短语。 We consider it hard to study English well.我们认为学好英语很难。 I consider it my duty to help you with your studies.我认为帮助你学习英语是我的职责。 4.consider+宾语从句。 We consider that the music is well worth listening to.我们这首音乐很值得一听。 在该题中,前一个句子中的consider作“考虑”解,后接动名词作宾语,但不可接不定式,由此可以排除A, B; 后一个句子中的consider作“认为”解,用到句型consider+sb./sth.+不定式,此处使用的是被动语态结构。故答案为D项。 请看下面两道考题,均考查“with+宾语+非谓语动词”结构: 1.—Come on, please give me some ideas about the project. —Sorry. With so much work _________my mind, I almost break down. A.filled B.filling C.to fill D.being filled 2.John received an invitation to dinner, and with his work _________, he gladly acc epted it. A.finished B.finishing C.having finished D.was finished 以上两题答案分别为B和A,均考查“with+宾语+非谓语动词”结构。该结果中的“非谓语动词”可以是不定式、现在分词、过去分词,它们在用法上的区别如下:

一般疑问句、选择疑问句的详细用法备课讲稿

一般疑问句、选择疑问句的详细用法

一般疑问句、 (一)一般疑问句 1、一般疑问句概述 一般疑问句(general questions),也可称为“yes/no” questions(是否型问句),因为它一般是由yes或no回答的,如: —Can you swim to the other side?你能游到对岸吗? —Yes, I can.是的,我能。 —No,I can’t.不,我不能。 —Have you locked the door?你锁门了吗? —Yes,I have.是的,锁了。 —No,I haven’t. 不,没有锁。 2一般疑问句的结构 (1)基本的结构为:be/助动词/情态动词+主语+谓语/表语+(其他),句子要读升调,如: Are they your friends?他们是你的朋友吗? Does he go to school on foot?他是步行去上学吗? Will you be free tonight?你今晚有空吗? Can you play basketball?你会打篮球吗? (2)陈述句亦可用作一般疑问句,多用在非正式文体中,句末有问号,用升调,如: Somebody is with you?有人和你一起吗? He didn’t finish the work?他没有做完活吗? You are fresh from America,I suppose?我猜,你刚从美国回来吧? 3、一般疑问句的答语 (1)一般疑问句一般由yes或no来回答,如: —Are you tired?你累了吗? —Yes,I am.是的,累了。 —No, I’m not.不,不累。 —Does she do the cleaning?她扫除了吗?

consider的用法归纳有哪些

consider的用法归纳有哪些 consider的用法:作名词 consideration作名词,意为careful thought and attention斟酌,考虑 Several considerations have influenced my decision.好几个因素影响了我的决定。 1.Consideration for顾及,体贴 He has never shown much consideration for his wife’s needs.他从来不顾及他妻 子的需要。 2.Under consideration在讨论/考虑中 Several projects are under consideration.好几个项目在讨论中。 There are some proposals under consideration. 有几个建议在审议中。 3.Take sth. into consideration考虑到某事,体谅 Your teachers will take your recent illness into consideration when marking your exams. 你的几位老师在给你的考试评分时,会考虑你最近生病这一情况的。 4.Leave sth. out of consideration 忽略/不重视某事 It was wrong to leave my feelings out of consideration.不顾及我的情感是不对的。 5.Show consideration for体谅,顾及 Jeff never shows any consideration for his mother’s feelings.杰夫从来不体谅他 母亲的感受。 6.of. No / little consideration无关紧要的,不重要的 Whether he would go with us or not was of no consideration. 他是否跟我们一起 去是无关紧要的。 7.In consideration of sth.作为对……的汇报,考虑到 It’s a small payment in consideration of your services.这是答谢您服务的微薄酬金。 consider的用法:作动词 1.Consider作动词,意为think about sth.考虑,斟酌 常用搭配:consider sth. / doing sth. / where(how, why)+to do /that clause; all things considered通盘考虑,考虑到问题的各个方面。如:

(完整word版)aquaqueanacleanPlatinum毛孔清洁仪中文说明书-更新

aqua queana clean Platinum毛孔清洁仪中文说明书 使用注意: 使用下列医疗电子仪器的人请不要使用 心脏起搏器等植入性医疗器械 人工心肺等生命维持医疗设备 心电计等装着式医疗机器 其它体内设置的医疗电子机器 因本产品可能会照成上述机器的误运作 下列人群请不要使用 ·心脏有障碍的人、恶性肿瘤病人、孕妇和刚生完小孩的人、血压异常、急性疼痛性疾、患糖尿病患者、接触化学纤维会发炎的人、癫痫、过敏性皮肤炎、感染症患者、过敏体质的人、发热性疾患的人、结核性疾患的人、肌肤特别敏感的人、脸部神经痛的人、血友病患者、心绞痛、多发性硬化症、刚被过度晒伤的人、紫斑病等容易内出血的人、因为交通事故等头部和眼部有后遗症的人、眼睛有疾患的人(白内障眼底出血等)、成长期中的儿童、四肢不变或意识模糊的人、生理周期中的人、正在接受其他治疗或疗养中的人或者身体异常的人

请不要使用在以下部位 头顶、眼球眼睑、口中、耳部、腋下、身体的脆弱部位或粘膜部位、整形过的部位 皮肤下植入了金属塑料或硅等物体的部位、有黑皮症的部位、有感觉知觉障碍的部位、 皮肤有损伤发炎色素异常或者湿疹脓包的部位 指定部位以外的其他不问 请不要在浴室厕所等潮湿易沾水的地方充电或者长时间使用 请不要在厨房和暖炉等火苗附近、车中、阳光直射的地方使用 初次试用时,请在肌肤不显眼的部位尝试试用,且使用时密切关注肌肤的状况 使用时请取下身上佩戴的贵金属 当天除毛脱毛了的部位请不要使用 使用时身体有任何不适或痛感,起疹变红发痒等症状,请立刻停止使用 使用时机器发臭或者发热请立刻停止使用(可能是机器故障) 使用前的确认(请确认取下了保护盖) 使用时不要再刮板上放置易燃物 机器规格 充电时间约1小时定个电压DC 5V 定格电流500mA 消费电力约 2.5w 周波数约29000Hz 尺寸15.8X 5.3X 1.5 (CM)本体重量约73g 电源线长度约75cm 原产地:本体韩国电源中国

remain用法总结

remain用法总结 标签:生活2011-12-09 13:54 星期五 英语中的remain 这一词的用法灵活,词性多样,初学者往往不明就里,无从下手,这里我们从动词、系动词、名词、形容词四个词性入手,谈谈“remain”的用法及变化,看看是否能助你快速解决“剩下来”这个问题。 一、remain 作为动词,均为不及物动词,但有两种意思,此时不能用进行时态,也没有被动语态: 1、remain “剩下”、“余下”、“遗留”,试看下例句子: Some of them have disappeared while others remain today. 它们中的一些已经消亡,然而另外一些今天仍然存在。 After the fire,very little remained of their house. 火灾之后,他们家所剩无几。 Only a few leaves remained (=were still) on the tree. 树上只剩下几片叶子了。 After the earthquake, very little remained of the city of Tangshan. 地震过后,唐山这座城市所剩无几。 2、remain “留下”、“停留”、“呆在”,相当于“stay” The children remained out because of the weather. 由于天气晴朗,孩子们继续呆在室外嬉戏。 When the others had gone, Joan remained (=stayed) to clean the room. 别人走了,琼留下来清扫房间。 The Smiths remained there all through the year. 史密斯一家人在那里呆了整年。 二、系动词:“保持”、“仍然是”,“依旧是”,后接形容词、名词、动词不定式、现在分词、过去分词或介词形容词短语作表语,指某人或某事物仍保持某种状态He remained silent. 他保持沉默。(接形容词) Whatever achievements you’ve made, you should remain modest. 无论你取得多么大的成就,你都该保持谦虚。(接形容词作表语) Man remained a hunter for thousands of years.人类的狩猎时期有数千年之久。(接名词) It remained a secret. 这仍然是个秘密。(接名词作表语) Peter became a manager, but Jack remained a worker. 彼得成为了一个经理,而杰克仍然是个工人。(接名词作表语) 指某事尚待、有待于以后被处置,后面常接不定式的被动形式,表示主语是不定式的承受者。 A lot of work remained to be done.许多工作还有待完成。(接动词不定式) Many problems remain to be solved. 有好多问题尚待解决。 It remains to be seen whether you are right. 你是否正确,以后见分晓。 We will remain in regular contact with them.我们将和他们保持经常的联系。(接介词短语)

特殊疑问句和一般疑问句的用法

(一)由be(am,is,are)引导的一般疑问句 1、Am I a student? 我是学生吗? Yes,you are./ No,you aren’t. 2、Is this /that/it a chair?这/那/它/是一把椅子吗? Yes,it is. /No,it isn’t. 3、Is she/Amy your sister?她/艾米是你的妹妹吗?Yes,she is ./ No,she isn’t. 4、Is he/Mike your brother?他/迈克是你的哥哥吗?Yes,he is./No,he isn’t. 5、Is your brother helpful at home? 你哥哥在家有用吗?Yes, he is./ No, he isn’t. 6、Is there a forest in the park? 在公园有一个森林吗? Yes,there is./No,there isn’t. 是的,有。/不,没有。 7、Are there any panda s in the mountains?在山上有熊猫吗? Yes,there are./No,there aren’t.是的,有。/不,没有。 8、Are they dusk s? 它们是鸭子吗?(问物) Yes, they are. /No,they aren’t.是的,它们是。/不,它们不是。 9、Are they famers? 他们是农民吗?(问人) Yes, they are. /No,they aren’t. 是的,他们是。/不,他们不是。 10、Are you a teacher?你是一个老师吗?(问you 用I回答) Yes, I am./No,I’m not.是的,我是。/不,我不是。 11、Are you teacher s?你们是老师吗? Yes,we are./No,we aren’t.是的,我们是。/不,我们不是。 (二)、由do引导的一般疑问句

英语连词符的用法

英语连词符的用法 英语复合词(compound words )是由两个或两个以上的自由词素构成,表达单一的语义概念,如:birth-control (计划生育),rainfall (降雨量),waterfall (瀑布),fireproof (防火的),sea green (象海一样绿的),等等。复合词在写法上一般有三种形式:粘写式,松散式和连字符式,很多复合词的书写形式可以是以上三种中的任何一种,如:oilfield ,oil field ,oil-field (油田)。一般地说,对于这三种书写形式的选择没有特别的规律可寻。为了更好体现复合词的语义单一性,越来越多的人选择粘写式,以便于从感官上使得复合词更像一个单词;松散式的写法很容易使人混淆复合词和词组的区别;那么何种情况更需要连字符书写式呢? 一、复合形容词作定语 1 .句式复合形容词作定语,如:The do-what-you-can-and-take-what-you-need policy (各尽所能,按需分配的政策),a never-to-be-forgotten day (永远不会忘记的日子),the still-to-be-discovered elements (有待发现的元素),a damned-if-they-do-and-damned-if-they-don’t choice (做也见鬼,不做也见鬼的选择),a wrapping-up-and-throwing-away gesture (一个包起来扔掉的手势),等等,以上复合词如果缺少连字符是很难理解的。 2 .一般性的复合形容词作定语最好要使用连字符,如: out-of-town guests (外地的宾客),a broad-minded judge (气量

否定疑问句的构成和用法

否定疑问句的构成和用法 反意疑问句是在陈述句后边加上一个简短问句,对陈述句所叙述的内容提出相反的疑问,这种句子就叫作反意疑问句。反意疑问句可以表示真实的疑问,也可以表示提问人的倾向、强调或反问。如果陈述句是肯定句时,后边的反意疑问句通常要用否定式;反之,如果陈述句是否定句时,后边的反意疑问句通常要用肯定式。陈述句和后边的反意疑问句的主语以及谓语动词的人称、数、时态通常要保持一致。例如: He speaks English, doesn't he? Mary won't do it, will she? Lies cannot cover up the facts, can they? 回答反意疑问句和回答一般疑问句一样,肯定回答用"Yes, +肯定结构";否定回答用"No, +否定结构"。这与汉语习惯有所不同。例如: -He's a doctor, isn't he?他是医生,对吧? -Yes, he is.对,他是医生。(No, he isn't.不,他不是医生。) -He isn't a doctor, is he?他不是医生,对吧? -Yes, he is.不,他是医生。(No, he isn't.对,他不是医生。) 在使用反意疑问句时,特别要注意以下几点: 1.当动词have作"有"讲时,可以有两种反意疑问句形式。例如: He hasn't any sisters, has he? He doesn't have any sisters, does he? 当have表示其它含义(如:经历、遭受、得到、吃……)讲时,只有一种反意疑问句形式: You all had a good time, didn't you? He often has colds, doesn't he? They had milk and bread for breakfast, didn't they? 2.如果陈述句的谓语动词含有have to, had to时,反意疑问句通常用其适当形式。例如: We have to get there at 8 a.m. tomorrow, don't we? They had to take the early train, didn't they? 3. need和dare既可以作情态动词,又可以作实义动词,注意有两种反意疑问句形式。例如: You needn't hand in your paper today, need you? You don't need to hand in your paper today, do you? He dare ask the teacher, dare not he? He doesn't dare to ask the teacher, does he? 4.如果陈述句的谓语动词含有used to时,也可以有两种反意疑问句形式。例如: He used to live in London, usedn't/ didn't he? 5.如果陈述句中出现never, seldom, hardly, scarcely, rarely, few, little, nobody, no one, nothing等含有否定意义的词时,反意疑问句通常要用肯定式。例如: She seldom goes to the concert, does she? He has few good reasons for staying, has he? 6.如果陈述句中的主语是不定式短语、动名词短语、从句、everything或nothing时,反意疑问句通常要用it作主语。例如: To sell/ Selling newspaper was his job, wasn't it? What he said is true, isn't it? Everything is all right, isn't it? 7.如果陈述句中的主语是不定代词everybody, everyone, somebody, someone, nobody, no one, each of等时,反意疑问句通常要用they或he作主语。例如: Somebody borrowed my bike, didn't they/ he? Each of them passed the exam, didn't they?

consider 用法

consider大致有两种含义。含义不同,用法有别。现归纳如下。 一、 consider作“考虑”解,常用于以下句型: 1. Consider+名词/代词/动名词。 You’d better consider my suggestion. 你最好考虑我的建议。 I’m considering going abroad some day.我一直考虑有一天出国。 2. Consider+从句或“疑问词+不定式”。 Have you considered what he suggested?你们考虑他的建议了吗? We must consider what to do next.我们必须考虑下一步要做什么。 二.Consider作“认为”解时,常用于以下句型: 1. Consider sb./sth+.(as)+形容词/名词。其中,as可以省略。 We consider him honest.我们认为他很诚实。 At first they considered me as a doctor.起初他们认为我是医生。 2.consider+sb./sth.+不定式。其中,不定式通常是to be(可以省略)或其他动词的完成式。We consider this matter to be very important.我们认为这件事很重要。 We all consider him to have stolen the bike.我们都认为他偷了自行车。 3.consider+it+形容词/名词+不定式短语。 We consider it hard to study English well.我们认为学好英语很难。 I consider it my duty to help you with your studies.我认为帮助你学习英语是我的职责。 4.consider+宾语从句。 We consider that the music is well worth listening to.我们这首音乐很值得一听

neat,tidy,clean

neat: 整洁的,巧妙的,端正的 例句与用法: 1. He keeps his office neat and tidy. 他保持办公室清洁整齐。 2. The naughty boy played a neat trick. 这个淘气的小男孩玩了一个巧妙的花招。 3. He has made neat paths and has built a wooden bridge over a pool. 他在花园里铺上整洁的小路,并在池塘上架起木桥。 4. She laid her dress on the bed to keep it neat. 她把连衣裙放在床上以保持平整。 5. The headmaster praised the boys for their neat turn-out. 校长表扬男同学服装整齐. clean: [ kli:n ] a. 干净的 ad. 完全地 n. 清洁 v. 打扫 vi. 打扫,清扫 vt. 把...弄干净 1. The bullet went clean through his arm. 子弹穿过他的手臂。 2. Please clean the window as I can hardly see out. 请把窗子弄干净,我几乎看不到外面。 3. You must keep your clothes clean. 你必须保持衣着整洁。 4. I clean forgot about it. 我完全忘记了这件事。 5. The mayor is determined to clean up the city. 市长决心清除市内的不良现象。 6. The burglars cleaned her out of all her jewellery. 窃贼把她所有的首饰都偷走了。 7. The doctor gave him a clean bill of health. 医生给他一份健康良好的报告。 tidy: [ 'taidi ]

consider的用法和短语例句

consider的用法和短语例句 consider有考虑;思考;认为;体谅等意思,consider的多种用法你了解多少呢,下面跟着小编一起来学习consider的用法和短语例句吧,希望对大家的学习有所帮助! consider的用法consider的用法1:consider的基本意思是用脑细想和斟酌,也可表示为找到结论而想方设法,还可以表示限定在确定的观点上,即认为。引申可表示关心顾及体谅等。 consider的用法2:consider作考虑解时,可用作不及物动词,也可用作及物动词。用作及物动词可接名词、代词、动名词、带疑问词的动词不定式或wh-从句作宾语。接动名词作宾语时,可用于进行时态。 consider的用法3:consider作认为解时,是正式语体,可接that 从句作宾语,也可接复合宾语。其宾语补足语可由名词、形容词、介词短语、动词不定式、现在分词、过去分词等充当。在用作宾语补足语的名词、形容词或介词短语之前,有时可插入to be或as。如果to be表示的时间先于谓语动词,则不可省略且须用完成时。consider 作关心,体谅,顾及解时,一般接名词作宾语。 consider的用法4:consider的过去分词considered有时可用作定语用来修饰其他名词,意思是考虑过的。 consider的用法5:consider可用于被动结构。

consider的常用短语consider over (v.+prep.) 考虑think about (sth) consider over sth consider相关词汇辨析consider,think,believe,count,deem,reckon,regard 这些动词均含有认为之意。 consider 指经过考虑和观察后得出的结论。 think 普通用词,指按照自己的意见提出看法。 believe 通常指根据一定的证据,经思考后而认为属实。 count 指作出判断后而得出的看法等。 deem 正式用词,常用于法律、文学,强调作判断而不是思考。 reckon 指对人或事作全面权衡,把各方面意见考虑进去后得出结论。 regard 侧重凭外表或表面现象作判断。多强调观点。 consider to do还是consider doing? I am considering to write an article.这个句子要表达的意思是:我正在考虑些一片文章。 句中出现consider这个词,它是名词consideration的动词形式。它是指考虑某人或某事物,尤其是指以做决定为目的的,细想。 我们先来熟悉一下这个词的用法,它的习惯用法有consider+名词或代词等,consideration+宾语从句,还有consider somebody or something for something or somebody或者是

相关主题
文本预览
相关文档 最新文档