C++: не ини­циа­ли­зи­руй­те объ­ек­ты сим­во­лом “=”

Всё ска­зан­ное здесь не от­но­сит­ся к Visual Studio. В этой си­сте­ме, во­пре­ки стан­дар­там, ини­циа­ли­за­ция ра­вен­ством эк­ви­ва­лент­на ини­циа­ли­за­ции скоб­ка­ми (кро­ме слу­чая explicit-кон­ст­рук­то­ров).

Ча­сто мож­но встре­тить код, в ко­то­ром кон­струи­руе­мый объ­ект ини­циа­ли­зи­ру­ет­ся сим­во­лом «=»:

MyClass x = 10;

Та­кая за­пись на­зы­ва­ет­ся ини­циа­ли­за­ци­ей ко­пии (copy-initialization).

На сай­те govnokod.ru к этой ста­тье от­нес­лись до­ста­точ­но не­га­тив­но (ци­ти­рую: «ав­тор еба­нул­ся»). В оправ­да­ние ска­жу, что с тех пор ста­тья бы­ла силь­но до­ра­бо­та­на.

При­выч­ка ис­поль­зо­вать ини­циа­ли­за­цию ко­пии по­шла, ви­ди­мо, из «сиш­ных» вре­мён, ко­гда клас­сов и кон­ст­рук­то­ров не бы­ло, а ука­зан­ная за­пись бы­ла един­ствен­ным спо­со­бом ини­циа­ли­за­ции. Вме­сто это­го сле­ду­ет, где толь­ко мож­но, ис­поль­зо­вать ва­ри­ант со скоб­ка­ми:

MyClass x(10);

Эта за­пись на­зы­ва­ет­ся пря­мой ини­циа­ли­за­ци­ей (direct-initialization).

Да­вай­те раз­бе­рём­ся со все­ми «за» и «про­тив».

1. Ини­циа­ли­за­ция ко­пии в об­щем слу­чае ме­нее эф­фек­тив­на, чем пря­мая ини­циа­ли­за­ция

User-defined conversion sequen­ces that can convert from the source type to the destination type or (when a conversion function is used) to a derived class are enumerated, and the best one is chosen through overload resolution. If the conversion cannot be done or is ambiguous, the initialization is ill-formed. The function selected is called with the initializer expression as its argument; if the fun­ction is a constructor, the call initiali­zes a temporary of the destination type. The result of the call (which is the temporary for the constructor case) is then used to direct-initialize, according to the rules above, the object that is the destination of the copy-initialization.

При­чи­на в том, что за­пись MyClass x = 10; эк­ви­ва­лент­на за­пи­си MyClass x( MyClass(10) ); (при этом внут­рен­нее вы­ра­же­ние MyClass(10) не обя­за­тель­но пред­став­ля­ет со­бой вы­зов кон­ст­рук­то­ра; это мо­жет быть так­же и поль­зо­ватель­ская функ­ция пре­об­ра­зо­ва­ния ти­па). Спра­ва при­ве­де­на вы­держ­ка из стан­дар­та C++ 2003, опи­сы­ваю­щая по­ве­де­ние ком­пи­ля­то­ра в этом слу­чае.

Дру­ги­ми сло­ва­ми, ис­поль­зуя знак ра­вен­ства вы вы­би­ра­е­те имен­но кон­ст­рук­тор ко­пии, а для не­го ком­пи­ля­тор уже пы­та­ет­ся по­до­брать под­хо­дя­щее пре­об­ра­зо­ва­ние ти­па. По­это­му та­кая ини­циа­ли­за­ция мо­жет при­ве­сти к со­зда­нию про­ме­жу­точ­ной ко­пии объ­ек­та да­же при на­ли­чии под­хо­дя­ще­го кон­ст­рук­то­ра.

Пря­мая же ини­циа­ли­за­ция (ини­циа­ли­за­ция скоб­ка­ми) поз­во­ля­ет ком­пи­ля­то­ру вы­брать под­хо­дя­щий кон­ст­рук­тор из тех, что опре­де­лил раз­ра­бот­чик клас­са.

Рас­смот­рим при­мер. До­пу­стим, име­ет­ся класс, ко­то­рый мо­жет быть ини­циа­ли­зи­ро­ван как объ­ек­том это­го же клас­са, так и це­лым чис­лом:

#include <iostream>

class MyInt
{
private:
    int x;
public:
    MyInt(int const y): x( y )
    { std::cout << "Constructor 1 called." << std::endl; }
    MyInt(MyInt const &y): x( y.x )
    { std::cout << "Constructor 2 called." << std::endl; }
};

int main(void)
{
    MyInt i = 1;

    return 0;
}

В этом при­ме­ре раз­ра­бот­чик клас­са сде­лал кон­ст­рук­тор для со­зда­ния эк­зем­пля­ра клас­са из встро­ен­но­го ти­па int, од­на­ко не­ра­ди­вый поль­зо­ватель клас­са бло­ки­ру­ет воз­мож­ность пря­мо­го кон­струи­ро­ва­ния. Вот, что мы по­лу­чим, за­пу­стив этот код:

Constructor 1 called.
Constructor 2 called.

От­ра­бо­та­ли оба кон­ст­рук­то­ра. Пер­вый — для пре­об­ра­зо­ва­ния ти­па int в тип MyInt, вто­рой — для со­зда­ния нуж­но­го нам объ­ек­та MyInt i из пре­об­ра­зо­ван­но­го.

Не­мно­го из­ме­ним код (те­ло клас­са та­кое же, как в преды­ду­щем при­ме­ре):

int main(void)
{
    MyInt i(1);

    return 0;
}

При за­пус­ке име­ем бо­лее ожи­дае­мый ре­зуль­тат:

Constructor 1 called.

Од­на­ко не всё так пло­хо. Стан­дарт C++ 2003 раз­ре­ша­ет ком­пи­ля­то­рам в не­ко­то­рых слу­ча­ях опус­кать вы­зов кон­ст­рук­то­ра ко­пии:

  • In a return statement in a function with a class return type, when the expression is the name of a non-volatile automatic object with the same cv-unqualified type as the function return type, the copy operation can be omitted by constructing the automatic object directly into the function’s return value.

  • When a temporary class object that has not been bound to a reference would be copied to a class object with the same cv-unqualified type, the copy operation can be omitted by constructing the temporary object directly into the target of the omitted copy.

Вто­рой пункт — как раз наш слу­чай. На­при­мер, в ком­пи­ля­то­ре GCC ин­тел­лект по ис­клю­че­нию вы­зо­вов лиш­них кон­ст­рук­то­ров ак­ти­ви­ру­ет­ся клю­чём -felide-constructors, а дезак­ти­ви­ру­ет­ся клю­чём -fno-elide-constructors.

Но да­же опу­щен­ный вы­зов кон­ст­рук­то­ра ко­пии не поз­во­лит нам от­ком­пи­ли­ро­вать про­грам­му, ес­ли кон­ст­рук­тор ко­пии скрыт (private):

#include <iostream>

class MyInt
{
private:
    int x;
    MyInt(MyInt const &y): x( y.x )
    { std::cout << "Constructor 2 called." << std::endl; }
public:
    MyInt(int const y): x( y )
    { std::cout << "Constructor 1 called." << std::endl; }
};

int main(void)
{
    MyInt i = 1; //Ошибка: конструктор копии скрыт

    return 0;
}

На govnokod.ru под­ска­зы­ва­ют, что это по­ве­де­ние ком­пи­ля­то­ра Visual Studio ис­прав­ля­ет­ся клю­чом /Za (Disable Language Extensions).

Код вы­ше — как раз тот слу­чай, ко­гда про­яв­ля­ет­ся без­раз­ли­чие ком­пи­ля­то­ра Visual Studio к спо­со­бу ини­циа­ли­за­ции; в Сту­дии при­мер от­ком­пи­ли­ру­ет­ся и бу­дет ра­бо­тать, че­го по стан­дар­ту не долж­но быть.

2. Ини­циа­ли­за­цию ко­пии лег­ко спу­тать с опе­ра­ци­ей при­сваи­ва­ния

Пом­ни­те, что чи­таю­щие ваш код мо­гут быть не очень хо­ро­шо зна­ко­мы с C++ и с тру­дом от­ли­чать кон­ст­рук­тор от при­сваи­ва­ния.

Рас­смот­рим при­мер:

std::string      s = "Anton";
int              n = (int) 11.23;
std::vector<int> v = (std::vector<int>) 11;

Для мно­гих лю­дей пер­вая строч­ка при­ве­дён­но­го ко­да зву­чит как «со­здать стро­ку s и при­сво­ить ей зна­че­ние "Anton"». Ошиб­кой та­ко­го объ­яс­не­ния яв­ля­ет­ся пред­по­ло­же­ние о су­ще­ство­ва­нии скон­струи­ро­ван­ной стро­ки на мо­мент за­пол­не­ния её дан­ны­ми. Эта ошиб­ка ста­но­вит­ся фа­таль­ной при по­пыт­ке ана­ло­гич­но по­нять тре­тью строч­ку: по­лу­ча­ет­ся, что мы со­зда­ём мас­сив це­лых чи­сел, а за­тем при­сваи­ва­ем ему чис­ло 11 (на са­мом же де­ле тре­тья строч­ка со­зда­ёт мас­сив из 11-ти ну­лей).

Тут есть ещё од­но зло — ис­поль­зо­ва­ние име­ни ти­па дан­ных в скоб­ках для пре­об­ра­зо­ва­ния ти­па (то­же на­сле­дие сиш­ных вре­мён). Я имею в ви­ду за­пи­си (std::vector<int>) и (int). Об­суж­де­ние этой про­бле­мы, од­на­ко, тре­бу­ет от­дель­ной ста­тьи.

По­это­му не услож­няй­те чте­ние и по­ни­ма­ние ва­шей про­грам­мы — сде­лай­те ис­поль­зо­ва­ние кон­ст­рук­то­ров бо­лее яв­ным при по­мо­щи круг­лых ско­бок:

std::string      s("Anton");
int              x((int)11.23);
std::vector<int> v(11);

Рас­смот­рим ещё при­мер, свя­зан­ный с по­ис­ком ошиб­ки в ко­де. Ко­гда мы про­смат­ри­ва­ем текст про­грам­мы, то за­ча­стую ана­ли­зи­ру­ем её на уров­не «изоб­ра­же­ния» (то, как она вы­гля­дит), а не на уров­не тек­ста. При этом нам бу­дет тя­же­ло най­ти ошиб­ку в сле­дую­щей про­грам­ме:

#include <iostream>

struct MyInt
{
    int x;
    MyInt &operator=(int const y) { x = y; return *this; }    
    MyInt(int const y): x(x) { ; }
    MyInt(MyInt const &y): x(y.x) { ; }
};

int main(void)
{
    MyInt i = 1; //Операция присваивания?

    std::cout << i.x << std::endl; //Выведет 0. Почему?

    i = 1;       //Операция присваивания!

    std::cout << i.x << std::endl; //Выведет 1
    return 0;
}

Про­бле­ма в том, что при пр­осмот­ре те­ла клас­са мы в первую оче­редь об­ра­ща­ем вни­ма­ние на опе­ра­цию при­сваи­ва­ния, так как она по­хо­жа на строч­ку MyInt i = 1;, ко­то­рая по­че­му-то не­вер­но ра­бо­та­ет.

3. Знак ра­вен­ства не вез­де мож­но ис­поль­зо­вать для ини­циа­ли­за­ции

Один из слу­ча­ев мы с ва­ми толь­ко что ви­де­ли: это спи­сок ини­циа­ли­за­то­ров в кон­ст­рук­то­рах клас­са. Ис­поль­зо­вать ра­вен­ство там нель­зя:

MyInt(MyInt const &y): x = y.x { ; } //Так нельзя
MyInt(MyInt const &y): x(y.x) { ; } //Так можно

Вто­рой слу­чай — ис­поль­зо­ва­ние бо­лее од­но­го ар­гу­мен­та для ини­циа­ли­за­ции. Ра­вен­ство поз­во­ля­ет ис­поль­зо­вать ров­но один ар­гу­мент. Пред­ста­вим, что у вас есть класс Fraction, со­зда­вае­мый из чис­ли­те­ля и зна­ме­на­те­ля ти­па int, то­гда:

Fraction f = 2, 3; //Так нельзя
Fraction f(2, 3); //Так можно

Ес­ли скоб­ка­ми ини­циа­ли­зи­ро­вать мож­но все­гда, а ра­вен­ством — лишь ино­гда, то по­че­му бы не ис­поль­зо­вать скоб­ки вез­де?

За­клю­че­ние

На­де­юсь, мне уда­лось пе­ре­убе­дить про­грам­ми­стов, пе­ре­шед­ших на C++ с язы­ка C в том, что ини­циа­ли­за­цию ра­вен­ством нуж­но за­быть, как страш­ный сон (вы ведь уже за­бы­ли про printf() для вы­во­да в кон­соль?)

В за­клю­че­ние до­бав­лю не­боль­шую лож­ку дёг­тя. По стан­дар­ту OpenMP ини­циа­ли­за­ция счёт­чи­ка рас­па­рал­ле­ли­ва­е­мо­го цик­ла долж­на вы­пол­нять­ся имен­но зна­ком ра­вен­ства, а не скоб­ка­ми:

#pragma omp parallel for
for(int i(0); i < N; ++i) //Так нельзя, несмотря на то, что выглядит красиво
  какая_нибудь_функция(i);

#pragma omp parallel for
for(int i = 0; i < N; ++i) //Так можно
  какая_нибудь_функция(i);

for(int i(0); i < N; ++i) //Так можно, так как цикл не распараллеливается
  какая_нибудь_функция(i);

На­де­юсь, этот де­фект вско­ре по­пра­вят.

107 отзывов на запись «C++: не ини­циа­ли­зи­руй­те объ­ек­ты сим­во­лом “=”»

gorban@nix:/tmp$ cat test.cpp 
#include <iostream>

class MyInt {
private:
    int x;
public:
    MyInt(int const y): x( y )
    { std::cout < < "Constructor 1 called." << std::endl; }
    MyInt(MyInt const &y): x( y.x )
    { std::cout << "Constructor 2 called." << std::endl; }
};

int main(void)
{
    MyInt i = 1;

    return 0;
}

gorban@nix:/tmp$ g++ test.cpp 
gorban@nix:/tmp$ ./a.out 
Constructor 1 called.
Спа­си­бо, разо­брал­ся. Ис­ти­на по­сре­ди­не. Че­рез па­ру дней об­нов­лю эту ста­тей­ку.
Зд­рас­т­вуй­те) Спа­си­бо боль­шое за ста­тью! Я на­чи­наю­щий в С++, и у ме­ня та­кой (воз­мож­но ту­по­ва­тый) во­прос:
а за­чем про­стые ти­пы ини­циа­ли­зи­ро­вать скоб­ка­ми (нар­пи­мер, int i(10);)? Это же про­стые ти­пы, а не клас­сы. Раз­ве у них есть кон­ст­рук­то­ры?
Для про­стых ти­пов не важ­но, как ини­циа­ли­зи­ро­вать.
buy clomid
where can i get clomid online
sildalis without a prescription
nexium online
wh0cd735078 CIALIS ONLINE
wh0cd548294 misoprostol
wh0cd49942 get the facts
wh0cd90438 Retin-A
wh0cd317718 OVER THE COUNTER VIAGRA
wh0cd49942 viagra
wh0cd90438 buy tadalafil online
wh0cd49942 tadalafil pharmacy
wh0cd90438 cialis online
wh0cd90438 Tadalafil Tablets
wh0cd90438 tadalafil
wh0cd90438 Tadalafil Mail Order
Thanks for finally talking about > C++: не ини­циа­ли­зи­руй­те объ­ек­ты сим­во­лом “=” | Image Processing
< Liked it!
wh0cd331985 neurontin
wh0cd283634 prednisone
After checking out a few of the articles on your website, I seriously appreciate your technique of writing a
blog. I saved it to my bookmark webpage list and will be checking back soon.
Please visit my website as well and tell me what you think.
wh0cd302022 viagra online
Awesome! Its truly amazing post, I have got much clear idea regarding from this
post.
hi!,I really like your writing very a lot! proportion we communicate more about your article on AOL? I require an expert in this area to solve my problem. May be that’s
you! Taking a look ahead to peer you.
Wonderful article! This is the type of info that
should be shared across the web. Shame on the seek engines for
not positioning this submit higher! Come on over and consult with my website . Thanks =)
I love what you guys are up too. Such clever work
and reporting! Keep up the fantastic works guys I’ve incorporated you guys to our blogroll.
Yes! Finally something about minecraft.
Appreciation to my father who shared with me concerning this web site, this
web site is truly amazing.
Thanks for every other fantastic post. The place else could anybody get that type of information in such a
perfect method of writing? I’ve a presentation subsequent week, and I’m
at the search for such info.
I am really enjoying the theme/design of your weblog. Do you ever run into any web browser compatibility problems?
A handful of my blog readers have complained about my site not working correctly in Explorer but looks great in Opera.
Do you have any ideas to help fix this problem?
Can you tell us more about this? I’d want to
find out some additional information.
I’ve been exploring for a bit for any high quality
articles or blog posts in this sort of house . Exploring
in Yahoo I ultimately stumbled upon this website. Studying this information So i am satisfied to exhibit that I’ve
an incredibly good uncanny feeling I discovered just what I needed. I such a lot no doubt will make certain to do not forget this site and give it a glance regularly.
I all the time used to read piece of writing in news papers but now
as I am a user of web thus from now I am using net for content, thanks to web.
You’ve made some decent points there. I checked on the internet to find out more about the
issue and found most individuals will go along with your views on this website.
Just want to say your article is as surprising. The clearness to your put
up is just excellent and that i can think you’re an expert on this subject.
Fine along with your permission let me to grasp your RSS feed to stay updated with drawing close post.
Thanks a million and please carry on the rewarding work.
If some one needs expert view concerning blogging and site-building then i recommend him/her to
pay a quick visit this website, Keep up the pleasant work.
Spot on with this write-up, I absolutely believe this web site needs a lot more attention. I’ll probably be returning to read more, thanks for the information!
Your way of explaining everything in this post is in fact
fastidious, every one be capable of effortlessly know it, Thanks a lot.
Thank you a bunch for sharing this with all people you really recognize what you are speaking approximately!
Bookmarked. Please also seek advice from my web site
=). We will have a link trade agreement between us
Hello! Someone in my Myspace group shared this site with us
so I came to check it out. I’m definitely enjoying the information. I’m bookmarking and will be tweeting this to my followers! Exceptional blog and brilliant design and style.
I’m not that much of a internet reader to be honest but your blogs really
nice, keep it up! I’ll go ahead and bookmark your site to come back
later. Cheers
Whoa! This blog looks exactly like my old one! It’s on a entirely different subject but it has pretty much the same page layout
and design. Outstanding choice of colors!
I got this site from my buddy who informed me regarding this web site and now this time I am visiting this web page and reading very informative articles
or reviews at this time.
Whats up very nice web site!! Man .. Excellent .. Amazing ..
I’ll bookmark your website and take the feeds additionally?
I am happy to seek out numerous useful info right
here in the put up, we’d like work out more techniques on this regard, thank you for sharing. . . . . .
Hello would you mind letting me know which hosting company you’re working with?
I’ve loaded your blog in 3 different web browsers and I must say this blog loads a lot faster then most.
Can you recommend a good internet hosting provider
at a fair price? Thanks, I appreciate it!
What’s up, its nice piece of writing about media print, we all know media is a fantastic
source of facts.
Thank you for some other informative website. Where else may I get that kind of info written in such an ideal means?
I’ve a challenge that I’m simply now running on, and I’ve
been on the look out for such info.
I was wondering if you ever considered changing the layout of your
website? Its very well written; I love what youve got to say.
But maybe you could a little more in the way of content so people could connect with it better. Youve got an awful lot of text for only having 1 or 2 images.
Maybe you could space it out better?
you are really a excellent webmaster. The site loading speed is
incredible. It kind of feels that you’re doing
any unique trick. Moreover, The contents are masterpiece.
you’ve done a wonderful activity on this subject!
Your way of explaining the whole thing in this article is actually good,
all be capable of without difficulty know it, Thanks a lot.
Woah! I’m really enjoying the template/theme of this blog.
It’s simple, yet effective. A lot of times it’s challenging to get
that «perfect balance» between usability and visual appearance.
I must say you have done a great job with this.
Additionally, the blog loads super quick for me on Opera.
Exceptional Blog!
I’m not certain the place you’re getting your info, however great topic.
I must spend a while studying more or figuring out more. Thanks for excellent information I was in search of this information for my mission. Feel free to surf to my website :: madden mobile coins buy cheap
Hey There. I found your blog using msn. This is a very well written article.
I’ll make sure to bookmark it and return to read more of your useful
info. Thanks for the post. I will certainly comeback. Here is my web blog; csgo skin betting tips; http://www.seat-sudautoemotion.fr,
I used to be able to find good info from your blog posts. Look into my web site :: mink lashes for sale
At this time I am going to do my breakfast, once having my breakfast coming
yet again to read additional news.
Nice post. I was checking constantly this blog
and I’m impressed! Very useful information specially the last part I care for such information a lot.
I was looking for this certain info for
a long time. Thank you and good luck.
When some one searches for his required thing, so he/she desires to be available that in detail, so that thing
is maintained over here. Feel free to visit my webpage: mink lashes bad kitty
Ahaa, its pleasant conversation regarding this article here at this weblog, I have read all that,
so at this time me also commenting at this place. my website csgo skins free [insightinsuranceconsulting.com]
Thank you for the good writeup. It actually was once a leisure account it.
Look advanced to far introduced agreeable from you! By
the way, how can we keep in touch? My blog post: madden 17 coins reddit (http://s-mkorea.com)
Thanks for sharing your thoughts on cs go weapon skins for sale.
Regards Stop by my web page :: cs go skins price checker
I could not resist commenting. Exceptionally well written! Here is my web site mink strip lashes canada
I read this paragraph completely regarding the resemblance of newest and
earlier technologies, it’s remarkable article. Also visit my homepage … nba live coins free
I do accept as true with all the ideas you’ve introduced to
your post. They’re really convincing and can certainly work. Nonetheless, the posts are too brief for starters. May you please prolong them a bit from next time?
Thank you for the post. My page; csgo skins for sale steam
Thanks for every other informative blog.
Where else may I am getting that kind of information written in such an ideal method?
I’ve a venture that I’m just now operating on, and I have been at the glance out for
such info. My page … cs go awp skins for sale
I wanted to thank you for this excellent read!!
I certainly loved every little bit of it. I’ve got you book marked to look at new things you post… Feel free to visit my blog: silk lashes vs synthetic
Do you mind if I quote a few of your posts as long as I provide credit
and sources back to your blog? My blog is in the exact same
area of interest as yours and my visitors would truly
benefit from a lot of the information you present here.
Please let me know if this alright with you. Thanks! Check out my web-site :: fifa coins free ps4
Aw, this was an incredibly good post. Spending some
time and actual effort to produce a great article… but what can I say…
I put things off a lot and never manage to get nearly anything done. Feel free to surf to my site nba live coins generator
Thanks on your marvelous posting! I really enjoyed reading it, you may be a great author.
I will be sure to bookmark your blog and will eventually come back very soon. I
want to encourage continue your great work, have a nice morning! Check out my blog post; csgo skins free no survey
Hey there! This is kind of off topic but I need some help from
an established blog. Is it very difficult to set up your own blog?
I’m not very techincal but I can figure things out pretty fast.
I’m thinking about making my own but I’m not sure where to start.
Do you have any points or suggestions? Appreciate it Here is my web-site — madden mobile coins free
Post writing is also a fun, if you know after that you can write or else it is complicated to write. My web site: csgolounge betting skins (http://www.nanofrabs.eu)
Keep on working, great job! Also visit my blog: nba live coins and cash; Jess,
Asking questions are truly fastidious thing if you are not understanding anything
completely, but this piece of writing presents good
understanding even. Stop by my site — mink lash extensions london
Greetings from Carolina! I’m bored at work so I decided
to browse your website on my iphone during lunch break. I enjoy the info you present here and can’t wait to take a look when I get home.
I’m amazed at how quick your blog loaded on my mobile .. I’m not even using WIFI, just 3G .. Anyways, fantastic site! Here is my site … best gaming systems, Maryjo,
Hi there just wanted to give you a quick heads up. The words in your post seem to be running off the screen in Opera.
I’m not sure if this is a format issue or something to do with internet browser compatibility but I thought I’d post to let you
know. The design look great though! Hope you get the problem resolved soon. Thanks Feel free to visit my website :: nba live coins free
There’s certainly a great deal to learn about this subject.
I love all the points you’ve made. Look at my site … csgo skins free no survey
We’re a gaggle of volunteers and opening a new scheme in our community. Your site provided us with valuable info to work on. You’ve performed an impressive task and our whole group
will likely be thankful to you. my web blog … silk lash extensions wholesale (mobedco.com)
After I initially commented I seem to have clicked on the -Notify me when new comments are added- checkbox and now every time
a comment is added I get four emails with the same comment.
There has to be a way you are able to remove me from
that service? Appreciate it! Feel free to surf to my site … silk lash extensions
perth (Dotty)
Magnificent website. A lot of helpful information here.
I am sending it to several friends ans additionally sharing in delicious.
And certainly, thank you for your sweat! Here is my blog post — groupon mink lashes nyc — Alejandra,
Hello there! This blog post could not be written any better!
Looking through this post reminds me of my previous roommate!
He continually kept preaching about this. I most certainly will send this article to him.
Pretty sure he will have a great read. Thanks for sharing! My weblog … ncaa football scores (Christen)
Great article, exactly what I needed. Here is my page: cs go weapon skins steam (Marjorie)
When some one searches for his necessary thing, thus he/she wants to be
available that in detail, therefore that thing is maintained
over here.
I was recommended this website by my cousin. I’m not sure whether this post
is written by him as nobody else know such
detailed about my difficulty. You’re amazing!
Thanks! Feel free to visit my webpage — mink eyelash extensions strips (totalmaskin.202.no)
Thanks for your marvelous posting! I certainly enjoyed reading it,
you could be a great author. I will be sure to bookmark your
blog and will often come back in the foreseeable future.
I want to encourage you to definitely continue your great posts, have a nice afternoon! Feel free to surf to my website cs go skins price rising (Katherine)
I do not know whether it’s just me or if perhaps everyone else encountering
issues with your site. It appears like some of the written text in your content are
running off the screen. Can somebody else please comment and
let me know if this is happening to them as well? This may be a problem with
my internet browser because I’ve had this happen previously. Many thanks Stop by my website :: csgo skins free download, http://www.e-wef.org,
I have read so many articles regarding the blogger lovers but this article is
in fact a pleasant post, keep it up. Have a look at my website — mink lash extensions nyc
Oh my goodness! Impressive article dude! Many thanks,
However I am having problems with your RSS. I don’t understand why I can’t
join it. Is there anyone else getting the same RSS problems? Anybody who knows the answer will you kindly respond?
Thanx!! Also visit my weblog — csgo skins free spin (Rebekah)
hello there and thank you for your information – I
have definitely picked up anything new from right
here. I did however expertise some technical points using this website, as I experienced to reload the website lots of times previous to I could get it to load
properly. I had been wondering if your web hosting is OK?
Not that I’m complaining, but sluggish loading instances times will very
frequently affect your placement in google and could damage your high quality
score if advertising and marketing with Adwords. Anyway I’m adding this RSS to my email and
can look out for a lot more of your respective fascinating content.
Make sure you update this again soon. Stop by my webpage: csgo skins free hack (empresas-enventa.com)
My spouse and I stumbled over here by a different web address and
thought I should check things out. I like what I see so i am just
following you. Look forward to checking out your web
page again. Feel free to surf to my homepage … nba mobile
coins for free (Quyen)
Great post. Also visit my webpage — mink lashes starter kit — Cortez -
I know this site presents quality based articles and additional data, is there
any other website which provides such things in quality? My web blog; madden mobile coins buy (Mitch)
If some one wants expert view concerning blogging and site-building then i advise him/her
to pay a quick visit this website, Keep up the pleasant job. Stop by my web site; cs go skins for sale ebay (Bernardo)
When I originally commented I clicked the «Notify me when new comments are added» checkbox
and now each time a comment is added I get four e-mails with the same comment.
Is there any way you can remove people from that service?
Cheers! My site — cs go skins no steam (http://www.tybeeislandmaritimeacademy.com/)
Have you ever thought about creating an ebook or
guest authoring on other sites? I have a blog based upon on the same ideas you
discuss and would love to have you share some stories/information. I know my visitors would appreciate your work.
If you are even remotely interested, feel free to shoot me
an e mail. my blog post — nba live coins reddit
Wonderful website you have here but I was wanting to know if you knew
of any user discussion forums that cover the same topics talked about in this article?
I’d really like to be a part of group where I can get
advice from other experienced people that share the same interest.
If you have any recommendations, please let me know.
Many thanks! Here is my homepage; nba live coins reddit
In fact when someone doesn’t be aware of after that its up to other visitors
that they will help, so here it takes place. Here is my webpage: mink individual lashes kit (Lorenzo)
Have you ever thought about including a little bit more than just your articles? I mean, what you say is fundamental and all.
Nevertheless think of if you added some great visuals or video clips to give your posts more,
«pop»! Your content is excellent but with images and
clips, this website could certainly be one of the very best in its field.
Great blog! my web page :: fifa coins zone discount (Larhonda)
Howdy! I know this is kind of off topic but I was wondering
which blog platform are you using for this website? I’m getting
fed up of WordPress because I’ve had issues with hackers
and I’m looking at alternatives for another platform. I would be great if you could point
me in the direction of a good platform.
Heya great blog! Does running a blog such as this require a massive amount work?
I’ve absolutely no knowledge of programming however I had been hoping to start my own blog in the near future.
Anyhow, if you have any suggestions or tips for new blog owners please share. I understand this is off topic but I just had to ask. Thanks! My page — madden mobile coin quick sell
Hey there! This is my 1st comment here so I just wanted to give a quick shout out and say I genuinely enjoy reading your blog posts. Can you suggest any other blogs/websites/forums that deal
with the same topics? Thank you! my web site … cs go skins price rising
Hello mates, how is everything, and what you want to say on the topic of this post,
in my view its actually remarkable in favor of me. my page :: fifa coins buy code — Juana,
Hello to every , because I am actually keen of reading this web
site’s post to be updated on a regular basis. It contains pleasant
information. my blog post: silk lash extensions vs mink
Hello my family member! I want to say that this post
is amazing, great written and include almost all important infos. I’d like to peer extra posts like this . Here is my page: silk lashes review (Gail)
Hello there, You have done a great job. I will
definitely digg it and personally suggest to my friends.
I’m confident they will be benefited from this website. Also visit my website: pubg weapons [Gladys]
Heya! I just wanted to ask if you ever have any trouble with hackers? My last blog (wordpress) was hacked and I ended up losing a few months of hard work due
to no back up. Do you have any solutions to stop hackers? Here is my web blog; real mink lashes for sale

Оставить отзыв

Жёлтые поля обязательны к заполнению

   

Можете использовать теги <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang=""> <div class=""> <span class=""> <br>